Сборка: Есть ли какое-либо преимущество передачи аргументов функции при использовании стека?

#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 строк).