本文主要是介绍详解汇编cll ret push pop 并附源码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一.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 10push 5push re;call 两步1:push rip+1(这个+1是下一步 不是地址偏移) 2jmpjmp fun
re: sub esp,4mov dword ptr[ebp-12],eaxinvoke printf,ADDR format,dword ptr[ebp-12] ;调用printf函数
2.函数实现
fun:push ebp;push 两步 sub eps,4(esp偏移4个字节) mov [esp],ebp(保存当前ebp)mov ebp,espsub esp,4mov dword ptr[ebp-4],0;mov dword ptr[ebp - 8], 1jmp s1s3:add dword ptr[ebp + 8],1s1:mov ecx,dword ptr[ebp +12]cmp dword ptr[ebp +8], ecxjge s2;如果左边大于等于右边跳出循环mov eax,dword ptr[ebp +8]mov ebx, dword ptr[ebp +12]imul eax,ebxmov dword ptr[ebp - 4],eax;invoke printf,ADDR format1,dword ptr[ebp - 4] ;调用printf函数jmp s3s2:mov eax,dword ptr[ebp-4]mov esp,ebpmov ebp,dword ptr[esp];pop 就是以下两步add esp,4ret;ret 两步1:pop rip(这个+1时下一步不是地址偏移) 2jmp
这篇关于详解汇编cll ret push pop 并附源码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!