一.call 实际上做了两次操作
1.push eip+1,(不能这么写)保存返回地址
2.jmp 跳转到函数
二.ret 实际上做了两次操作和call
1.pop eip(不能这么写),取出返回的地址
2. 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
s

本文详细解析了x86汇编中call、jmp和ret操作的实质,包括push和pop对栈帧的影响,以及在函数调用和返回过程中的具体步骤。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



