详解汇编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 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
相关推荐
啊森要自信4 分钟前
【QT】常⽤控件详解(七)容器类控件 GroupBox && TabWidget && 布局管理器 && Spacer
linux·开发语言·c++·qt·adb
智者知已应修善业26 分钟前
【51单片机2个按键控制流水灯转向】2022-10-25
c语言·经验分享·笔记·嵌入式硬件·51单片机
源代码•宸37 分钟前
C++高频知识点(二十)
开发语言·c++·经验分享·epoll·拆包封包·名称修饰
写点什么呢39 分钟前
Stlink识别不到-安装驱动
stm32·单片机·嵌入式硬件·学习
重启的码农1 小时前
ZeroTier 源码解析 (2) 节点 (Node)
c++·网络协议
重启的码农1 小时前
ZeroTier源码解析 (3) 身份 (Identity)
c++·网络协议
遇见你的雩风1 小时前
C++结构体的赋形之记
c++
郝学胜-神的一滴2 小时前
Horse3D引擎研发笔记(一):从使用Qt的OpenGL库绘制三角形开始
c++·qt·3d·unity·图形渲染·unreal engine
善 .2 小时前
单片机输出高电平的两种方式
单片机·嵌入式硬件
草莓熊Lotso2 小时前
《解锁 C++ 起源与核心:命名空间用法 + 版本演进全知道》
c++·经验分享·笔记·其他