Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вызов Asm функций из С

14K
05 декабря 2009 года
Fenja
138 / / 20.03.2009
Доброго времени суток.
Имею функцию, написанную на С
 
Код:
int Compare (int x, int y, int xMin, int xMax, int yMin, int yMax, int status) {
    if ((x>=xMin)&&(x<=xMax)&&(y>=yMin)&&(y<=yMax)&&(status==1)) {
        return (1);
    } else return 0;
}

И мне ее нужно реализовать на Asm'е :)
Получается так:
Код:
int Compare (int x,     //Текущая координата Х
             int y,     //Текущая координата Y
             int xMin,  //Минимальное значение X
             int xMax,  //Максимальное значение Y
             int yMin,  //Минимальное значение Y
             int yMax,  //Максимальное значение Y
             int status
             )
{
    int temp;  
    __asm
    {  
        push eax;
        push ebx;
        push ebp;
   
        mov eax, [ebp + 8];     //eax = x
        mov ebx, [ebp + 16];    //ebx = xMin
        cmp eax, ebx;
        jl NoCondition; //если меньше, переход на конец
        mov ebx, [ebp + 20];    //ebx = xMax
        cmp eax, ebx;
        jg NoCondition; //если больше, переход на конец
        mov eax, [ebp + 12];    //eax = y
        mov ebx, [ebp + 24];    //ebx = yMin
        cmp eax, ebx;
        jl NoCondition;
        mov ebx, [ebp + 28];
        cmp eax, ebx
        jg NoCondition;
        mov ebx, [ebp + 32];
        cmp ebx, 1;
        jne NoCondition;
        mov eax, 1;
        mov temp, eax;
        jmp end;

NoCondition:
        xor eax,eax;
        mov temp, eax;

end:
        pop ebp;
        pop ebx;
        pop eax;
    }
    return temp;

На сколько я знаю, при стандарном вызове функии в С результат возвращается через регистр eax, а вот как его вернуть - я не знаю. Просьба помочь с возвратом значения :)
7
05 декабря 2009 года
@pixo $oft
3.4K / / 20.09.2006
Эммм…дайте-ка подумать:rolleyes:
Может,написать что-то типа
 
Код:
Mov EAX,<результат>
:)
Или я неправильно понял вопроса.А ещё не худо бывает следить за балансом стека(это не автору в упрёк,а на будущее;))
14K
05 декабря 2009 года
Fenja
138 / / 20.03.2009
Цитата:
Может,написать что-то типа


Убрал

 
Код:
push eax;
...
pop eax;

Все гуд, можно я думаю так оставить :)
Цитата:
А ещё не худо бывает следить за балансом стека


А поподробнее?

7
05 декабря 2009 года
@pixo $oft
3.4K / / 20.09.2006
Хм,а зачем было Push/Pop EAX?Сохраняли регистр,дабы что-нибудь страшное не случилось?:) Так знайте–функции WinAPI(и,соответственно,ваши) должны сохранять EBP,EBX и вроде ESI(или EDI,точно не помню)
Т.к. EAX используется для возврата значений,то,естественно,его сохранять не надо,и все программы должны об этом помнить

А баланс стека–это когда число запушенных байт равно числу выпопленных.Как-то так (=
А то можно случайно попнуть адрес возврата или напушить всякой дряни,которую воспримет инструкция Ret в качестве аргумента,и прости-прощай,CS:IP:D
14K
05 декабря 2009 года
Fenja
138 / / 20.03.2009
Цитата:
Хм,а зачем было Push/Pop EAX?Сохраняли регистр,дабы что-нибудь страшное не случилось? Так знайте–функции WinAPI(и,соответственно,ваши) должны сохранять EBP,EBX и вроде ESI(или EDI,точно не помню)


Привычка :)

399
06 декабря 2009 года
KIV
432 / / 20.01.2009
Функции WinAPI должны сохранять EBP, EBX, ESI, EDI.
7
06 декабря 2009 года
@pixo $oft
3.4K / / 20.09.2006
Ну вот,я был почти прав.Значит,они сохраняют оба индексных регистра
Получается,что в циклах за просто так вызывать API-функции нельзя.Придётся самому сохранять ECX(например)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог