Linux X64 粗糙的理解函数中的指令调用(call,leave,ret)和栈的使用过程(push pop)
#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)相关推荐
- linux janus命令,深入理解janus中的plugin管理
janus中的plugin是其非常重要的一部分内容,今天我们就来对这块内容做一下分析,看看janus是如何实现plugin的,以及它的工作原理是怎样的. janus的架构模型 janus的最大特色就是 ...
- web前端高级JavaScript - 一道题彻底理解函数中this指向和闭包作用域
关于函数中this指向和闭包作用域的一道练习题 javascript 代码 var x = 3,obj = {x: 5}; obj.fn = (function(){this.x *= ++x;ret ...
- linux sip 桥接,linux – 如何在FreeSWITCH pbx软件中关闭SIP调用的RTP缓冲?
我想在freeswitch pbx软件中关闭SIP调用的缓冲. Freeswitch在缓冲区中保存来自客户端的RTP数据,并每隔20ms发送一次. 我希望freeswitch能够在没有保持的情况下通过 ...
- python构造函数调用成员函数_成员函数中的Python调用构造函数
让我们以这个类为例,它正在扩展MySQLDB的connection对象.在class DBHandler(mysql.connections.Connection): def __init__(sel ...
- 基础强化:深入理解JVM中的方法调用
作者:xiaolyuh my.oschina.net/xiaolyuh/blog/3168216 方法调用并不等同于方法中的代码被执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法 ...
- 函数中参数的调用*args **kwargs
1.函数意义在于复用 格式 def 函数名 ([参数1,参数2......]) 在调用时函数运行--> 函数名([参数]) 2.可变参数(参数可同时按格式输入多个)*args * ...
- 【软件开发底层知识修炼】二十三 ABI-应用程序二进制接口三之深入理解函数栈帧的形成与摧毁
上两篇文章我们初步接触了ABI-应用程序二进制接口的概念,点击链接查看上一篇文章:[软件开发底层知识修炼]二十二 ABI-应用程序二进制接口 二.了解了为什么会有ABI的存在.本篇文章继续学习ABI ...
- 理解php中的yield
理解php中的yield <?php function gen() {$ret = (yield 'yield1');var_dump($ret);$ret = (yield 'yield2') ...
- linux ioctl root权限,Linux系统调用设备的ioctl函数
Linux系统调用设备的ioctl函数 在命令行调用设备的ioctl函数.在Linux系统中,似乎对设备的直接操作只有ioctl函数了.他接受的参数不是太多,而且都是一一对应的. blockdev - ...
最新文章
- linux编辑器翻页,Linux的Vim编辑器的使用Part1:输入模式、移动光标和翻页
- Java连载2-Java特性
- 2020年8月编程语言排行榜新鲜出炉 - 编程语言世界的假期
- 第一章 初始MySQL
- 每天一个linux 命令 find命令
- 百度:在O(1)空间复杂度范围内对一个数组中前后连段有序数组进行归并排序
- 完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
- php 按引用传递的使用
- NVelocity介绍
- 服务器系统启用flash,基础设置:Windows Server 2012及2012R2 启用IE Flash
- python遍历json对象顺序输出_fastJson顺序遍历JSON字段
- FPGA编程语言--VHDL OR Verilog?
- 【结合文献】——Affymatrix芯片数据预处理
- IDC发布最新中国AI云服务市场报告,百度智能云连续三次排名第一
- html首页随机飘浮图片,jQuery 全屏随机漂浮图片广告
- linux修改ip地址详解
- 黑月教主去水印软件_推荐大家一款免费去水印软和视频编辑软件—无水印剪辑APP...
- 解决JupyterLab或者Jupyter Notebook无法跳转到浏览器的问题
- 八年级地理上册复习提纲(星球版)
- 爬虫入门——电影top250爬取