首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解objdump的输出,关于间接的jmp?

如何理解objdump的输出,关于间接的jmp?
EN

Stack Overflow用户
提问于 2015-03-05 07:29:16
回答 1查看 2.9K关注 0票数 1

当objdump -S my_program时,通常可以看到以下间接jmp指令,它通常用于开关/案例跳转表:

ffffffff802e04d3: ff 24 d5 38 2e 10 81 jmpq *-0x7eefd1c8(,%rdx,8)

如何理解地址-0x7eefd1c8?它意味着表的基地址是0xffffffff802e04d3 - 0x7eefd1c8

另外,我如何从-0x7eefd1c8获得ff 24 d5 38 2e 10 81

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-05 16:46:00

解码问题

比你看英特尔开发手册更重要

  • ff是JMP操作码(跳近,绝对间接)1
  • 24是一个ModR/M字节2,这意味着SIB字节会跟随它(JMP只有一个操作数,因此忽略寄存器字段)
  • d5是一个SIB字节2,这意味着disp32之后,Scale = 8Index = %rdx (在32位模式下,索引应该是%edx)没有基。
  • 38 2e 10 81是一个4字节的disp32操作数.如果将其编码为双字,您将得到0x81102e38注意,最高位设置为1。这是一个符号位,意思是值被编码在两个的补码编码3中。

从两个补码中转换出我们的预期数:

代码语言:javascript
复制
>>> print hex(0x81102e38 - (1 << 32))
-0x7eefd1c8 

当处理器以64位模式执行该指令时,它从0xffffffff81102e38 + (%rdx * 8)读取8个字节(原始数字是符号扩展的),并将该四字放入%rip 4中。

参考手册:

  1. 第2A卷,第3.2节说明(A-M),第3-440页
  2. 第2卷,2.1.5编址- ModR/M和SIB Bytes的模式编码,第2-6页.2-7页
  3. 卷1,第4.2.1.2节,签名整数,第4至4页
  4. 第2卷,第2.2.1.3节-位移,第2-11页
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28872279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档