【发布时间】:2011-01-17 16:38:00
【问题描述】:
我有一个问题,因为跳转指令通过添加有符号偏移量来更改 EIP 寄存器(如果我在这里没有犯错的话),在 IA-32 架构上,如何从位置 0x7FFFFFFF(有符号逻辑中的最大正数)到 0x80000000(有符号逻辑中的最小负数)可能吗?或者由于签名逻辑的性质,不应该有这样的跳跃?
【问题讨论】:
我有一个问题,因为跳转指令通过添加有符号偏移量来更改 EIP 寄存器(如果我在这里没有犯错的话),在 IA-32 架构上,如何从位置 0x7FFFFFFF(有符号逻辑中的最大正数)到 0x80000000(有符号逻辑中的最小负数)可能吗?或者由于签名逻辑的性质,不应该有这样的跳跃?
【问题讨论】:
有符号和无符号只是解释相同位模式的两种方式。这种解释不会改变加法的执行方式。 7FFFFFFF + 1 始终为 80000000,但这可以解释为有符号(负数)或无符号(正数)。
指令指针总是被解释为无符号的(显然负地址没有意义),这样就回答了你的问题。
【讨论】:
相对跳转实际上没有符号。跳转指令的编号被简单地添加到 EIP。所以你可以在 32 位地址空间中任意跳转。
示例:如果 EIP 为 20,而您想跳转到 4,则使用 jmp 0FFFFFFF0h。将这个大数加到 EIP 中,实际上与减去 16 相同。
要从 7FFFFFFFh 跳转到 80000000h,您将使用跳转 1。:-) 但是您的地址确实重叠,因此在实践中没有用。
另请注意,所有加法和减法逻辑都适用于任何符号。操作总是相同的,包括相对跳转。
【讨论】:
由于“平面”寻址模式,地址在 x86 下是无符号的。 intels 开发人员手册的寻址模式部分应该涵盖这一点,所有无条件/条件相对跳转的部分也可能会提到一些内容,但无论由于整数溢出,它们都可以工作。
【讨论】: