Сборка: есть ли преимущество передачи аргументов функции при использовании стека? - PullRequest
0 голосов
/ 02 мая 2011

Мне было интересно, было ли какое-либо преимущество передачи аргументов функциям, использующим стек, на языке ассемблера.Вот что я имею в виду:

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

Ответы [ 2 ]

1 голос
/ 02 мая 2011

Нет, в конечном коде нет разницы, но это очень удобно. Это макрос, который автоматически проверяет, совпадают ли типы аргументов, что помогает вам обнаруживать ошибки. Конечно, invoke readString, eax или push eax; call readString почти одинаковы, но предположим, что вам нужно вызвать Win32'a API с тысячами параметров:

    push NULL
    push hInst
    push NULL
    push NULL
    push 200
    push 300
    push CW_USEDEFAULT
    push CW_USEDEFAULT
    push WS_OVERLAPPEDWINDOW
    push addr Appame
    push addr Classame
    push WS_EX_CLIENTEDGE
    call CreateWindowEx
    INVOKE CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR AppName,\
           WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
           CW_USEDEFAULT,300,200,NULL,NULL,\
           hInst,NULL

В этом случае uning invoke гораздо полезнее и удобочитаемее.

1 голос
/ 02 мая 2011

Не совсем; invoke - это, по сути, просто встроенный макрос, который в любом случае расширится почти до одного и того же кода.

...