前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >x86_64 的 CALL 指令长度会发生变化吗?

x86_64 的 CALL 指令长度会发生变化吗?

作者头像
酷酷的哀殿
发布2021-04-26 10:36:04
8750
发布2021-04-26 10:36:04
举报

最近和群友讨论指令集时,遇到一个有意思的问题,x86_64CALL 指令长度会发生变化吗?

今天我们通过一个简单的例子验证一下长度会发生变化

call 指令简介

CALL[1] 指令调用一个过程,指挥处理器从新的内存地址开始执行。过程使用 RET(从过程返回)指令将处理器转回到该过程被调用的程序点上。

根据源码的不同,会两种不同开头和长度的指令[2]: e8ff

image

以下面的示例代码[3]为例:

  1. 第 6 行代码代表跳转到地址为 0x1 的地址执行
  2. 第 9 行代码代表跳转到地址为 0x40113e 的地址执行

image

经过编译后,会转为两种不同写法的 call 指令:

为了方便对照,采用 clang -O3 进行编译

  1. 第一个跳转命令被拆分到 3 个指令,其中 call 指令是 ffd1 ,代表跳转到 $rcx 寄存器存储的地址执行
  2. 第二个跳转指令会以 e8 开头,后面跟着 1f 00 00 00 1f 00 00 00 代表实际执行的指令地址与下个指令地址的偏移量。 该行指令的地址是0x40111a ,下一个指令的地址是 0x40111f 两个地址相减:0x40113e - 0x40111f = 0x1f所以,偏移量是 0x1f

参考资料

[1]

CALL: http://c.biancheng.net/view/3537.html

[2]

指令: http://ref.x86asm.net/coder64-abc.html

[3]

示例代码: https://godbolt.org/z/5dMnsxq33

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 酷酷的哀殿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • call 指令简介
    • 参考资料
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档