#assembly #stack #masm #procedure
#сборка #стек #masm #процедура
Вопрос:
Мне было интересно, есть ли какое-либо преимущество передачи аргументов функциям с использованием стека на языке ассемблера. Вот что я имею в виду:
readString PROTO :DWORD ;Prototype for function
;Now we call the function by moving a DWORD value into eax and pushing eax
mov eax, FAD37EABh
push eax
CALL readString
Есть ли какое-либо преимущество использования этого метода перед следующим?
INVOKE readString, FAD37EABh
С уважением,
Devjeet
Ответ №1:
Нет, в конечном коде нет разницы, но это очень удобно. Это макрос, который автоматически проверяет, совпадает ли тип аргументов, тем самым помогая вам выявлять ошибки. Конечно, invoke readString, eax
или push eax; call readString
это почти одно и то же, но предположим, вам нужно вызвать Win32 ‘a API с их тысячами параметров:
нажимать NULL нажать hInst нажимать NULL нажимать NULL нажимаем 200 нажмите 300 нажмите CW_USEDEFAULT нажмите CW_USEDEFAULT нажмите WS_OVERLAPPEDWINDOW нажмите addr Appame нажмите addr Classame нажмите WS_EX_CLIENTEDGE вызовите CreateWindowEx
ВЫЗОВИТЕ CreateWindowEx,WS_EX_CLIENTEDGE,ADDR className,ADDR AppName, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, 300, 200, NULL, NULL, hInst, NULL
В этом случае uning invoke
намного более полезен и удобочитаем.
Ответ №2:
Не совсем; invoke
по сути, это просто встроенный макрос, который в любом случае будет расширяться практически до того же кода.
Комментарии:
1. @devjeetroy: Я обычно предпочитаю
invoke
синтаксис, но есть люди, которые не согласны. Код Windows, в частности, становится действительно длинным , если вы выполняете все нажатия явно (например, один вызов CreateFile заканчивается длиной ~ 20 строк).