如果您希望您的例程获得 4 个参数,请先将它们推入堆栈:
push bp ; save old value of bp
mov bp, sp ; make bp our reference point
sub sp, 2 ; creates a local variable,it can be accessed by [bp-2]
此外,您必须通过以下方式终止您的功能:
mov esp, ebp
pop ebp
该代码:
mov bx,3
push bx ; 3rd element on stack
mov cs,4
push cx ; 4th element on stack
看起来您正在尝试为新函数调用准备参数。
这应该略有不同:
要匹配cdecl(此示例使用 cdecl)调用约定(如果您想将 asm 与 c 等一起使用,您需要以相反的顺序推送输入参数 - 假设您需要 4 个输入参数(整数 - 32 位)。C/C++ 调用 func(0xaa,0xbb,0xcc,0xdd) 的 Asm 脚本如下所示:
push 0DDh 4bytes
push 0CCh
push 0BBh
push 0AAh
call func // another 'push'
add esp, 10h
现在您的例程可能如下所示:
push ebp //next push
mov ebp, esp
// your args are '2 pushes' away (call, push ebp) = 8 bytes away
// hence 1st arg is [ebp+8], 2nd is [ebp+12], 3rd is [ebp+16], 4th is [ebp+20]
// loading args to regs
mov eax, dword ptr [ebp+8] // 0xAA - 1st arg
mov ebx, dword ptr [ebp+12] // 0xBB - 2nd arg
mov ecx, dword ptr [ebp+16] // 0xCC - 3rd arg
mov edx, dword ptr [ebp+20] // 0xDD - 4th arg
mov esp, ebp
pop ebp
ret
但是如果你想使用局部变量 - 这里是如何使用 2 个局部变量以及作为参数传递的 4 个 int 变量:
push ebp
mov ebp, esp
sub esp, 8 // for 2 local int(32bit) variables
mov dword ptr[ebp-4], 3 // set one local var to 3
mov dword ptr[ebp-8], 4 // set one local var to 4
mov eax, dword ptr [ebp+8] // 0xAA - 1st arg
mov ebx, dword ptr [ebp+12] // 0xBB - 2nd arg
mov ecx, dword ptr [ebp+16] // 0xCC - 3rd arg
mov edx, dword ptr [ebp+20] // 0xDD - 4th arg
add esp, 8 // remove space for local vars
mov esp, ebp
pop ebp
ret