В этом разделе используется другой тип вызова быстрый
II
В этом разделе используется другой тип вызова - быстрый, или регистровый. В соответствии с таблицей в начале главы, этот тип вызова предполагает, что три первых параметра будут передаваться в регистрах (EAX,EDX,ECX), а остальные в стеке, как и в случае соглашения stdcall. При этом если стек был задействован, освобождение его возлагается на вызываемую процедуру. Есть еще один нюанс. В случае быстрого вызова транслятор Си добавляет к имени значок @ спереди, что мы естественно учитываем в ассемблерном модуле.
#include <windows.h> #include <stdio.h> // файл ADDC.cpp // объявляется внешняя функция сложения четырех целых чисел extern "C" _fastcall ADDD(DWORD, DWORD, DWORD, DWORD); void main() { DWORD a,b,c,d; a=1; b=2; c=3; d=4; printf("%lu\n",(DWORD *)ADDD(a,b,c,d)); ExitProcess(0); }
; файл add.asm .386P .MODEL FLAT, stdcall PUBLIC @ADDD ; плоская модель _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' ; процедура возвращает сумму четырех параметров ; передача параметров регистровая ; первые три параметра в регистрах EAX,EDX,ECX ; четвертый параметр в стеке, т.е. [ЕРВ+08Н] @ADDD PROC PUSH EBP MOV EBP,ESP ADD EAX,ECX ADD EAX,EDX ADD EAX,DWORD PTR [EBP+08H] POP EBP RET 4 @ADDD ENDP _TEXT ENDS END