Код (Text): // Листинг 1.11 Вызов функции Си из ассемлерного блока // команды CALL и RET #include <stdio.h> #include <windows.h> int fsub(int ,int); int a; char s[]="%d"; void main() { _asm { push 100 push 250 call fsub mov a, eax lea eax, s push a push eax call printf add esp,8 } } int fsub(int a, int b) { __asm { mov eax,a sub eax,b ret 8 } } Код верно переписан из книги. Но мне кажется дело в add esp,8. Но сколько я не мучил ничего не получается. Что-то со стеком. Great: про тег [code] не забываем=)
Нужно сделать int _declspec(naked) fsub(int a, int b), а то компилятор генерирует стандартный пролог и эпилог.
ajak Код (Text): void main(void) { /* BHC style */ printf("%d\n", -150); } Соптимизировал и сделал более кросс-платформенным ж-)
Если вот так, то у меня работает )) call dword ptr [printf] Хех, только выходит с кодо 10, который printf возвращает )
ну тогда попробуй Код (Text): int _stdcall fsub(int a, int b) и да - убери в ней RET 8 (а то сишные компилеры этого не любят!!111)
ajak Не проще ли в Olly посмотреть, что там происходит? Но если с Olly совсем все плохо -- выложи сюда, а то предполагать, в каком виде сейчас исходник можно довольно долго.
ajak Понимаешь, книга наверняка про старые компиляторы. Я бы не мучался и прочел бы доку по Студии. По моему опыту "соглашения о связях" постоянно меняются. Ну и второе : ты так и не сказал на каком вызове вылетает. Если в printf, значит ты просто ей не то передал. В отладчике смотри параметры. Кстати студия позволяет "влезать внутрь" системных функций - там и увидишь, что ты ей подсунул и почему она вылетает.
Код (Text): #include <stdio.h> #include <windows.h> int fsub(int ,int); int a; char s[]="%d"; void main() { _asm { push 100 push 250 call fsub add esp, 8 ; FIXED! because of _cdecl mov a, eax lea eax, s push a push eax call printf add esp,8 xor eax, eax ; FIXED! Return value } } int fsub(int a, int b) { __asm { mov eax,a sub eax,b leave ; FIXED! Stack correction ret } }