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 функций из С
Имею функцию, написанную на С
Код:
И мне ее нужно реализовать на 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;
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, а вот как его вернуть - я не знаю. Просьба помочь с возвратом значения :)
Может,написать что-то типа
Код:
Mov EAX,<результат>
Или я неправильно понял вопроса.А ещё не худо бывает следить за балансом стека(это не автору в упрёк,а на будущее;))
Цитата:
Может,написать что-то типа
Убрал
Код:
push eax;
...
pop eax;
...
pop eax;
Все гуд, можно я думаю так оставить :)
Цитата:
А ещё не худо бывает следить за балансом стека
А поподробнее?
Т.к. EAX используется для возврата значений,то,естественно,его сохранять не надо,и все программы должны об этом помнить
А баланс стека–это когда число запушенных байт равно числу выпопленных.Как-то так (=
А то можно случайно попнуть адрес возврата или напушить всякой дряни,которую воспримет инструкция Ret в качестве аргумента,и прости-прощай,CS:IP:D
Цитата:
Хм,а зачем было Push/Pop EAX?Сохраняли регистр,дабы что-нибудь страшное не случилось? Так знайте–функции WinAPI(и,соответственно,ваши) должны сохранять EBP,EBX и вроде ESI(или EDI,точно не помню)
Привычка :)
Функции WinAPI должны сохранять EBP, EBX, ESI, EDI.
Получается,что в циклах за просто так вызывать API-функции нельзя.Придётся самому сохранять ECX(например)