当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
发布于 2015-03-05 16:46:00
解码问题
比你看英特尔开发手册更重要
ff是JMP操作码(跳近,绝对间接)124是一个ModR/M字节2,这意味着SIB字节会跟随它(JMP只有一个操作数,因此忽略寄存器字段)d5是一个SIB字节2,这意味着disp32之后,Scale = 8和Index = %rdx (在32位模式下,索引应该是%edx)没有基。38 2e 10 81是一个4字节的disp32操作数.如果将其编码为双字,您将得到0x81102e38注意,最高位设置为1。这是一个符号位,意思是值被编码在两个的补码编码3中。从两个补码中转换出我们的预期数:
>>> print hex(0x81102e38 - (1 << 32))
-0x7eefd1c8 当处理器以64位模式执行该指令时,它从0xffffffff81102e38 + (%rdx * 8)读取8个字节(原始数字是符号扩展的),并将该四字放入%rip 4中。
参考手册:
https://stackoverflow.com/questions/28872279
复制相似问题