#include"../common"//.intel_syntax noprefix#define as(...) asm volatile(__VA_ARGS__)/*函数的内存布局(rsp -> stack top ; rbp -> stack bottom ; )栈底是高地址,栈顶是低地址,增长方向由高到低!eg. 1://call test_ret; push rip+1  //下一个指令的位置,并不是 call之前的原地址!!!记住重点,要加1jmp test_ret2//每次call test_ret 都有//push prev_rip+1 test_ret:push rbp;//保存前一个函数栈帧(底)地址mov rbp,rsp;//设置当前的栈底,并且也保存了rsp...中间代码.........//leave 合并mov rsp,rbppop rbp//ret 合并pop ripjmp rip 3.栈内数据(X64:8bytes 地址数据)H   prev_rip+1prv_rbp...   <- new_rbp = rsp...L5.读数据 从低地址往高地址 读,读数据顺序 和 栈增长数据方向 高->低,key for acknowledge process*/void test_ret(){size_t curr_rip = 0;#ifdef __x86_64__//testas("movq 8(%%rsp),%0;"// "movq %%rax,%0;":"=a"(curr_rip));//rbp 和 rsp在中间代码中 并不相等!!!这句输出地址有可能是错误的log("prev rip=0x",std::hex,curr_rip,(size_t)test_ret);//testas("movq 8(%%rbp),%0;"// "movq %%rax,%0;":"=a"(curr_rip));//rbp 和 rsp在中间代码中 并不相等!!!//只有和main 地址相差不大,才可能正确的指令地址log("prev rip=0x",std::hex,curr_rip,(size_t)test_ret);//testas("movq (%%rbp),%0;":"=a"(curr_rip));//testlog("prev ebp=",std::hex,curr_rip);//testas("movq 8(%%rbp),%0;":"=a"(curr_rip));//testlog("rip =",std::hex,curr_rip);//test_ret 之后的指令地址!!!// as("jmpq *%0;"::"m"(curr_rip));// as("leave;retq;");//OK//leave -> 恢复前一个函数的栈帧(栈底)地址,恢复rsp的指向as("movq %rbp,%rsp;popq %rbp;");//retas("popq %rax;jmpq *%rax;"); //perfect to 退出本函数//这个内嵌汇编 jmp后是指针地址 ,不能忽视 * 号//要indirect , 不能 direct!!!(就是直译的意思:间接)// as("movq 8(%rbp),%rax;jmp *%rax;"); //这句是不会执行的!嘿嘿...log("最后说一句,最后走没有走这里!");#endif
}int main(){log("main address:",std::hex,(size_t)main);log("test start...");//<=> call test_rettest_ret();//test_ret 栈帧中存储的指令地址,是test_ret 之后的 首地址;也就是下一句开头指令地址;log("test end...");//指令的地址 和 数据的地址 是不一样的!!!不一定是线性连在一起的!!!return 0;
}
[testOrderRet.cpp:97|main|Jul 22 2020/01:20:55] main address:  402b79
[testOrderRet.cpp:98|main|Jul 22 2020/01:20:55] test start...
[testOrderRet.cpp:58|test_ret|Jul 22 2020/01:20:55] prev rip=0x  ffffffffffffffff 401aa7
[testOrderRet.cpp:67|test_ret|Jul 22 2020/01:20:55] prev rip=0x  40301d 401aa7
[testOrderRet.cpp:70|test_ret|Jul 22 2020/01:20:55] prev ebp=  7ffcd02333f0
[testOrderRet.cpp:74|test_ret|Jul 22 2020/01:20:55] rip =  40301d
[testOrderRet.cpp:101|main|Jul 22 2020/01:20:55] test end...

Linux X64 粗糙的理解函数中的指令调用(call,leave,ret)和栈的使用过程(push pop)相关推荐

  1. linux janus命令,深入理解janus中的plugin管理

    janus中的plugin是其非常重要的一部分内容,今天我们就来对这块内容做一下分析,看看janus是如何实现plugin的,以及它的工作原理是怎样的. janus的架构模型 janus的最大特色就是 ...

  2. web前端高级JavaScript - 一道题彻底理解函数中this指向和闭包作用域

    关于函数中this指向和闭包作用域的一道练习题 javascript 代码 var x = 3,obj = {x: 5}; obj.fn = (function(){this.x *= ++x;ret ...

  3. linux sip 桥接,linux – 如何在FreeSWITCH pbx软件中关闭SIP调用的RTP缓冲?

    我想在freeswitch pbx软件中关闭SIP调用的缓冲. Freeswitch在缓冲区中保存来自客户端的RTP数据,并每隔20ms发送一次. 我希望freeswitch能够在没有保持的情况下通过 ...

  4. python构造函数调用成员函数_成员函数中的Python调用构造函数

    让我们以这个类为例,它正在扩展MySQLDB的connection对象.在class DBHandler(mysql.connections.Connection): def __init__(sel ...

  5. 基础强化:深入理解JVM中的方法调用

    作者:xiaolyuh my.oschina.net/xiaolyuh/blog/3168216 方法调用并不等同于方法中的代码被执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法 ...

  6. 函数中参数的调用*args **kwargs

    1.函数意义在于复用 格式 def 函数名 ([参数1,参数2......]) 在调用时函数运行--> 函数名([参数]) 2.可变参数(参数可同时按格式输入多个)*args         * ...

  7. 【软件开发底层知识修炼】二十三 ABI-应用程序二进制接口三之深入理解函数栈帧的形成与摧毁

    上两篇文章我们初步接触了ABI-应用程序二进制接口的概念,点击链接查看上一篇文章:[软件开发底层知识修炼]二十二 ABI-应用程序二进制接口 二.了解了为什么会有ABI的存在.本篇文章继续学习ABI ...

  8. 理解php中的yield

    理解php中的yield <?php function gen() {$ret = (yield 'yield1');var_dump($ret);$ret = (yield 'yield2') ...

  9. linux ioctl root权限,Linux系统调用设备的ioctl函数

    Linux系统调用设备的ioctl函数 在命令行调用设备的ioctl函数.在Linux系统中,似乎对设备的直接操作只有ioctl函数了.他接受的参数不是太多,而且都是一一对应的. blockdev - ...

最新文章

  1. linux编辑器翻页,Linux的Vim编辑器的使用Part1:输入模式、移动光标和翻页
  2. Java连载2-Java特性
  3. 2020年8月编程语言排行榜新鲜出炉 - 编程语言世界的假期
  4. 第一章 初始MySQL
  5. 每天一个linux 命令 find命令
  6. 百度:在O(1)空间复杂度范围内对一个数组中前后连段有序数组进行归并排序
  7. 完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
  8. php 按引用传递的使用
  9. NVelocity介绍
  10. 服务器系统启用flash,基础设置:Windows Server 2012及2012R2 启用IE Flash
  11. python遍历json对象顺序输出_fastJson顺序遍历JSON字段
  12. FPGA编程语言--VHDL OR Verilog?
  13. 【结合文献】——Affymatrix芯片数据预处理
  14. IDC发布最新中国AI云服务市场报告,百度智能云连续三次排名第一
  15. html首页随机飘浮图片,jQuery 全屏随机漂浮图片广告
  16. linux修改ip地址详解
  17. 黑月教主去水印软件_推荐大家一款免费去水印软和视频编辑软件—无水印剪辑APP...
  18. 解决JupyterLab或者Jupyter Notebook无法跳转到浏览器的问题
  19. 八年级地理上册复习提纲(星球版)
  20. 爬虫入门——电影top250爬取

热门文章

  1. 为大家推荐几个不错的学习公众号
  2. ERP的主要功能模块
  3. PR视频字幕批量生成程序(用讯飞听见识别音频)
  4. HDR Efex Pro 2 for mac(DHR滤镜工具)
  5. CSDN 私房菜——情人节告白:从今以后,小助手要陪你成王
  6. NPM酷库:accounting,格式化数字和货币
  7. Java 文件下载/上传限流算法
  8. 从AFN错误码中获取错误code和信息
  9. 专利申请 mysql_如何写专利(示例代码)
  10. 还一场精彩绝伦的时装秀,为努力奋斗的这些年