2014-12-30 9 views
3

Я хочу создать функцию, которая получает 1 байт аргумент. Но я читаю, что в x86 я могу только наложить 2 или 4 байта на стек. Итак, следует ли ожидать, что аргумент 2 байта будет передан моей функции, а затем извлечет мой 1 байт? Является ли это тем, как передать аргумент 1 байта моей функции:Передача аргумента 1 байта функции?

push WORD 123 
+0

Передайте его как 8-разрядный регистр или нажмите 16-битный регистр в стеке (имея 8 младших или старших бит в качестве значения, которое вы хотите) –

ответ

2

Стек должен быть выровнен. Если вы выполняете 16-битную программу реального режима, стек должен быть выровнен по 16 бит. Если вы делаете 32-битную программу с защищенным режимом, стек должен быть выровнен на 32 бита.

Но вам не нужно передавать точно 1 байт функции. Просто нажмите 16/32 бит и используйте только самые низкие из них в функции. Что-то вроде этого:

use32 
proc MyFunc, .arg32, .arg16, .arg8 
begin 
     mov eax, [.arg32] 
     mov bx, word [.arg16] 
     mov cl, byte [.arg8] 
     ret 
endp 

Main: 
     push ecx ; CL is arg8 
     push ebx ; BX is arg16 
     push eax ; EAX is arg32 
     call MyFunc 

; Or shortly: 
     stdcall MyFunc, eax, ebx, ecx