0

我有一个问题,那是因为跳转指令通过添加带符号的偏移量来更改 EIP 寄存器(如果我在这里没有犯错),在 IA-32 架构上,如何从位置 0x7FFFFFFF(有符号逻辑中的最大正数)到 0x80000000(有符号逻辑中的最小负数)可能吗?或者由于有符号逻辑的性质,也许不应该有这样的跳跃?

4

3 回答 3

5

有符号和无符号只是解释相同位模式的两种方式。这种解释不会改变加法的执行方式。7FFFFFFF + 1 始终为 80000000,但这可以解释为有符号(负数)或无符号(正数)。

指令指针总是被解释为无符号的(显然负地址没有意义),这样就回答了你的问题。

于 2011-01-17T16:59:10.987 回答
2

相对跳跃实际上没有符号。跳转指令的编号被简单地添加到 EIP。因此,您可以在 32 位地址空间中任意跳转。

示例:如果 EIP 为 20,而您想跳转到 4,则使用 jmp 0FFFFFFF0h。这个大数字被添加到 EIP,这实际上与减去 16 相同。

要从 7FFFFFFFh 跳转到 80000000h,您将使用跳转 1。:-) 但是您的地址确实重叠,因此在实践中它是无用的。

另请注意,无论符号如何,所有加法和减法逻辑都有效。操作总是相同的,包括相对跳转。

于 2011-01-17T16:42:24.563 回答
1

由于“平面”寻址模式,地址在 x86 下是无符号的。英特尔开发人员手册的寻址模式部分应该涵盖这一点,所有无条件/条件相对跳转的部分也可能会提到一些内容,但无论由于整数溢出,它们都会起作用。

于 2011-01-17T16:51:50.830 回答