会有这样的跳跃案例,如果是的话怎么样?

时间:2011-01-17 16:38:00

标签: assembly offset signed

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

相对跳跃实际上没有签名。跳转指令中的数字只是添加到EIP中。所以你可以跳到32位地址空间的任何地方。

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

要从7FFFFFFFh跳到80000000h,你可以使用跳转1. :-)但是你的地址确实重叠,所以它在实践中没用。

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

答案 2 :(得分:1)

由于“平坦”寻址模式,地址在x86下未签名。 intels开发人员手册的寻址模式部分应该涵盖这一点,所有un /条件相对跳转的部分也可能提到一些内容,但是由于整数溢出它们都可以工作。