详解汇编cll ret push pop 并附源码

一.call 实际上做了两次操作

1.push eip+1,(不能这么写)保存返回地址

2.jmp 跳转到函数

二.ret 实际上做了两次操作和call

1.pop eip(不能这么写),取出返回的地址

  1. jmp 跳转到pop取出来的地址

三.push rbp 开辟栈帧 做了两步操作

1.sub esp,4

2.mov ptresp ebp

四.pop rbp 释放栈帧

1.mov ebp,ptresp

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
相关推荐
wuminyu几秒前
JDK21中虚拟线程和FFM协同实现高并发源码剖析
java·linux·c语言·jvm·c++
SWAGGY..12 分钟前
【C++进阶】:(1)继承机制详解
java·jvm·c++
听取WA声一片(无恶意)42 分钟前
CSP-J/CSP-S 深度优先搜索(DFS)完全讲义
c++·算法·深度优先
码匠许师傅1 小时前
【C++ 面试真题】27. 聊聊 C++ 的内存泄漏与内存布局
java·c++·面试
徽京人1 小时前
VS Code 接入Esp 32步骤
vscode·单片机·嵌入式硬件
极客互动API2 小时前
企业微信 iPad 协议服务搭建与 AI 回调实战
网络·汇编·人工智能·微信·企业微信·ipad
QH139292318802 小时前
Keysight N5183B N5183B 微波模拟信号发生器
网络·单片机·嵌入式硬件·集成测试·信息与通信
加油码2 小时前
动静态库的链接底层原理(进阶版)
linux·c++
一木 之林2 小时前
三、内存管理、指针与堆栈
c语言·jvm·c++
笨笨饿3 小时前
#110_SCH3000 平台图传系统配置指南:从 DVP 摄像头到 UVC/WiFi 双通道传输
c语言·stm32·单片机·嵌入式硬件·物联网·vim