一.call 实际上做了两次操作
1.push eip+1,(不能这么写)保存返回地址
2.jmp 跳转到函数
二.ret 实际上做了两次操作和call
1.pop eip(不能这么写),取出返回的地址
- jmp 跳转到pop取出来的地址
三.push rbp 开辟栈帧 做了两步操作
1.sub esp,4
2.mov ptr[esp] ebp
四.pop rbp 释放栈帧
1.mov ebp,ptr[esp]
2.add esp,4
五.源码
1.调用函数
push 10
push 5
push re;call 两步1:push rip+1(这个+1是下一步 不是地址偏移) 2jmp
jmp fun
re:
sub esp,4
mov dword ptr[ebp-12],eax
invoke printf,ADDR format,dword ptr[ebp-12] ;调用printf函数
2.函数实现
fun:
push ebp;push 两步 sub eps,4(esp偏移4个字节) mov [esp],ebp(保存当前ebp)
mov ebp,esp
sub esp,4
mov dword ptr[ebp-4],0
;mov dword ptr[ebp - 8], 1
jmp s1
s3:
add dword ptr[ebp + 8],1
s1:
mov ecx,dword ptr[ebp +12]
cmp dword ptr[ebp +8], ecx
jge s2;如果左边大于等于右边跳出循环
mov eax,dword ptr[ebp +8]
mov ebx, dword ptr[ebp +12]
imul eax,ebx
mov dword ptr[ebp - 4],eax
;invoke printf,ADDR format1,dword ptr[ebp - 4] ;调用printf函数
jmp s3
s2:
mov eax,dword ptr[ebp-4]
mov esp,ebp
mov ebp,dword ptr[esp];pop 就是以下两步
add esp,4
ret;ret 两步1:pop rip(这个+1时下一步不是地址偏移) 2jmp