详解汇编cll ret push pop 并附源码
2023-12-31 14:53:50
一.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
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
文章来源:https://blog.csdn.net/xilango/article/details/135315281
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!