详解汇编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 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

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-03 15:28:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-03 15:28:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-03 15:28:04       82 阅读
  4. Python语言-面向对象

    2024-01-03 15:28:04       91 阅读

热门阅读

  1. MySQL5.7更新的内容

    2024-01-03 15:28:04       50 阅读
  2. 微服务(12)

    2024-01-03 15:28:04       51 阅读
  3. bash脚本从ini文件读取设置

    2024-01-03 15:28:04       57 阅读
  4. Word2Vec原理+gensim实现

    2024-01-03 15:28:04       66 阅读
  5. MyBatis_传入参数的问题

    2024-01-03 15:28:04       53 阅读
  6. 云主机存储网络相关技术概念及网络拓扑介绍

    2024-01-03 15:28:04       55 阅读
  7. 断言assert

    2024-01-03 15:28:04       45 阅读
  8. 什么是制造业中的数字孪生?

    2024-01-03 15:28:04       48 阅读