栈帧布局:
.code
arrSum proc
; 开辟栈帧
push ebp ; 将ebp的值压入栈
mov ebp,esp ; 将esp的值,赋值到ebp
; 开辟栈空间,用于保存局部变量
; 不开辟,局部变量的值有可能被覆盖
sub esp , 12
mov eax,[ebp - 08h] ; => 第二个局部变量
mov eax,[ebp - 04h] ; => 第一个局部变量
mov eax,[ebp + 00h] ; => 保存旧的ebp的值
mov eax,[ebp + 04h] ; 返回地址
mov eax,[ebp + 08h] ; => 第一个形参
mov eax,[ebp + 0ch] ; => 第二个形参
; push ecx 1.
;当设计到在语句1和语句2之间使用ecx的值,并且在语句2以后要改变ecx的值
;要先将ecx压栈,这样可以任意对ecx修改。用完后弹栈即可恢复ecx的原值。
;不会对后续程序造成影响
; pop ecx 2.
; 恢复栈帧
mov esp,ebp ; 将ebp的值赋值到esp
pop ebp ; 将栈顶数据保存到ebp
ret 8
arrSum endp
entry:
;stdcall的方式传参第二个形参先入栈
push 10 ;第二个形参
push 11 ;第一个形参
call arrSum
push eax
push offset format
call crt__cprintf
add esp,8
ret
end entry
end
注:
;ret指令会弹出函数返回地址,使得esp-4;
;ret 8指令会弹出函数返回地址,使得esp-4.然后再弹出两个空间,使得esp再减去8