Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функции Ассемблера, в программе на языке C 
V
    Опции темы
rujmaster
Дата 13.12.2009, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Есть функция, написанная на Ассемблере, требуется добавить ее в проект, написанный на языке С. Среда разработки MV C++ 6.0  
Функция на ассемблере:
Код

_BSS SEGMENT WORD PUBLIC 'DATA'

_BSS    ends

_TEXT   SEGMENT WORD PUBLIC 'CODE'
        ASSUME  cs: _TEXT, ds:_BSS
        PUBLIC   _power2
_power2 PROC
        push    bp     ;Входная последовательность-сохранения регис-
                        ;тра BP.
        mov     bp,sp  ;Установка записи активации.

        mov     ax,[bp+4]  ;Загрузка Arg1 в AX.
        mov     cx,[bp+6]  ;Загрузка Arg2 в CX.
        shl     ax,cl      ;AX = AX+(2 в степени CX).
                           ;Значение возврата остается в AX.
        pop     bp   ;Выходная последовательность-восстановление ре-
                     ; гистра BP.
        ret          ;Выход.
_power2 ENDP
_TEXT   ENDS
       END

код на С:

Код

//main.c
#include <stdio.h>
#include "module.h"

int main () {

    int a,b;

    scanf ("%d %d", &a, &b);

    power2 (a,b);

    return 0;
}

//module.h

#ifndef MODULE_H
#define MODULE_H

extern int    power2(int a, int b);


#endif


В-общем, как не пытался, компоновать не хочет. Куда нужно добавлять фаил obj? 


Это сообщение отредактировал(а) rujmaster - 13.12.2009, 23:03
PM MAIL   Вверх
586
Дата 13.12.2009, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Цитата(rujmaster @  13.12.2009,  22:42 Найти цитируемый пост)
Среда разработки MV C++ 6.0  

Visual C++ 6.0? Он же 32-битные exe-шники компилирует. Твой ассемблер не подойдёт. Нужен masm32.
PM   Вверх
rujmaster
Дата 13.12.2009, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Хорошо, допустим не MV6. Какую среду разработки выбрать? На ассемблере нужен именно tasm.
Cтавил Borland C++ 5.5, так он вообще ничего скомпилировать не может. Не находит библиотек.
А если изменить код asm на 32 разр?


PM MAIL   Вверх
smoke_man
Дата 13.12.2009, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 25.1.2007
Где: Рязань

Репутация: нет
Всего: 17



Посмотри пример тут, а если tasm нужен, то для 32 разр используй tasm32.


--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
bsa
Дата 13.12.2009, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



rujmaster, если эта ассемблерная функция делает только то, что написал ты, то проще написать на си: b + (a << 1)
PM   Вверх
rujmaster
Дата 13.12.2009, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Ну в-общем то эта функция была взята в качестве примера. Реально же мне нужно создать функции для работы со строками, и я не могу отступать от требований лабораторной работы smile 
PM MAIL   Вверх
EvilsInterrupt
Дата 13.12.2009, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



rujmaster
Слова про лабораторную работу, должен был сказать в первом посту! А тут множество людей, сразу не понимают, что человеку надо так и начинают давать кучу не нужных советов! ;)

А по делу!
Напиши тоже самое на fasm , синтаксис простой! Закомпиль в ввиде coff , ф-ции по cdecl декларации! Создай прототип на сях и обжуху закинь в проект в MS Visual Studio как обычный проект.
Не было требования по выбору ассемблера, потому предлагаю именно ФАСМ !!! Потому что разивается, а в мире ПО это чуть ли не важное свойство! Синтаксис тасмо-подобный! Имеет туеву хучу форматов и есть реализации под разными платформами! Это если ты будешь преподу говорить, надумав взять фасм ;)


ЗЫ:
Попробую с утра набросать, если работа не засосет )
PM MAIL WWW ICQ Jabber   Вверх
rujmaster
Дата 14.12.2009, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Всем спасибо за советы, надеюсь дело сдвинется с мёртвой точки smile
PM MAIL   Вверх
rujmaster
Дата 14.12.2009, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Скачал borland C 3.1 , решил все таки использовать 16разр. В качестве примера взял следующую функцию:
Код


_BSS SEGMENT WORD PUBLIC 'DATA' 

_BSS    ends
 
_TEXT   SEGMENT WORD PUBLIC 'CODE'
        ASSUME  cs: _TEXT, ds:_BSS
        PUBLIC   _func1
_func1 PROC
     push    bp     ;пролог 
    ;push    si
    push    dx           
    mov     bp,sp  ;
    mov     ax,[bp+4]  ;
    mov    dx,[bp+6]

    add    ax,dx    

     pop    dx  
     pop     bp   ;эпилог           
     ret          ;Выход.
_func1 ENDP
_TEXT   ENDS
       END


Модуль на С:
Код


#include "stdio.h"
extern  int  func1 (int,int);


int main () {
    int a,b, z;
    scanf ("%d", &a);
    scanf ("%d", &b);
    z=func1 (a,b);
    printf ("%d\n", z);

    return 0;
}



Вроде компонуется и даже что-то считает  smile , хоть и неверно.
К примеру, если на вход записать a=1, b=1, то результат выводится = 748.
В чем ошибка?
Думаю, тему уже нужно в другой раздел smile

Это сообщение отредактировал(а) rujmaster - 14.12.2009, 21:45
PM MAIL   Вверх
smoke_man
Дата 14.12.2009, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 25.1.2007
Где: Рязань

Репутация: нет
Всего: 17



Посмотри тут.
Попробуй int a,b,z - поменять на short int

Добавлено через 1 минуту и 27 секунд
И тоже самое с прототипом функции funcl - int поменять на short int.


--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
bsa
Дата 15.12.2009, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



rujmaster, у Borland C++ есть возможность компиляции в ассемблерный текст. Напиши на С++ функцию, которая принимает то же количество аргументов, затем сделай ассемблерный текст и посмотри, как "достаются" переменные из стека.
PM   Вверх
xvr
Дата 15.12.2009, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Во первых -    mov     bp,sp надо ставить СРАЗУ ПОСЛЕ push bp
Во вторых - константы в mov     ?x,[bp+4] будут зависеть от модели памяти.
Советую написать функцию на С, потом откомпилировать ее в ассемблер и посмотреть на константы и на пролог/эпилог функции.

PM MAIL   Вверх
rujmaster
Дата 15.12.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Спасибо, вопросов больше нет smile
PM MAIL   Вверх
rujmaster
Дата 15.12.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



А вообще-то есть )). Вот функция подсчета длины строки на asm:
Код

.MODEL SMALL

_BSS SEGMENT WORD PUBLIC 'DATA' 

_BSS    ends
 
_TEXT   SEGMENT WORD PUBLIC 'CODE'
        ASSUME  cs: _TEXT, ds:_BSS
PUBLIC   _func1
_func1 PROC NEAR
    ;arg    a:byte;
        push    bp     ;пролог        
        mov     bp,sp  ;
    xor    ax,ax
    xor    dx,dx
    jmp    m0
m1:    inc    dx
m0:
    mov    bx, word ptr [bp+4]
    add    bx,dx
    cmp    byte ptr [bx],0
    jne    m1
    mov    ax,dx
            pop     bp   ;эпилог           
            ret          
_func1 ENDP
_TEXT ENDS
END

Не понятна строчка :
Код

cmp    byte ptr [bx],0

почему bx в скобках?, и почему здесь необходимо делать преобразование?
PM MAIL   Вверх
xvr
Дата 15.12.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(rujmaster @ 15.12.2009,  15:16)
Не понятна строчка :
Код

cmp    byte ptr [bx],0

почему bx в скобках?, 

В скобках потому что это косвенная адресация - из памяти читается байт по адресу содержащемуся в bx и ставнивается с 0

Цитата

и почему здесь необходимо делать преобразование?
Потому что иначе невозможно сказать какого размера надо делать чтение (и сравнение). Из мнемоники не ясно - байт/слово/двойное слово

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0862 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.