是0xF0000000负数还是正数?

时间:2011-07-11 22:36:34

标签: assembly

我正在使用ARM程序集,并尝试(再次)取消跳转表。链接的图像是来自canon rebel t1i固件转储的跳转表条目。在这种情况下,R0(我将其称为arg1)是一些> = 0x10000091的数字(如附图所示)。

我想知道这里如何使用0xF0000000。我唯一能想到的是它必须是一些负数......因为这是我能在这里理解事物的唯一方法。我在评论中解决的方式是假设0xF0000000 = -268435445,但正如我在那里解释的那样它似乎不起作用......

非常感谢任何帮助!!

code snippet

4 个答案:

答案 0 :(得分:6)

无论是正面还是负面都无关紧要。

如果您单步执行R0的可能值,则可以得到:

R0          ADD...      SUB...
10000091 => 00000091 => 00000000 => branch to loc_FF1CC924
10000092 => 00000092 => 00000001 => branch to loc_FF1CC928
10000093 => 00000093 => 00000002 => branch to loc_FF1CC92C
10000094 => 00000094 => 00000003 => branch to loc_FF1CC930
10000095 => 00000095 => 00000004 => branch to loc_FF1CC934

anything else will fall through  => branch to loc_FF1CFAEC

答案 1 :(得分:3)

它可以是正面的,也可以是负面的;这取决于具体情况。对于假定值为带符号的4字节整数的情况,它等于-268,435,456。对于假定值为无符号4字节整数(例如地址)的情况,它等于4,026,531,840。

这是Google's calculations for the negative value

这是Google's calculations for the positive value

答案 2 :(得分:1)

0xF0000000只是一个符号。它可以代表任何东西。

作为32位数字的十六进制表示,它可以是正数也可以是负数,具体取决于数字是有符号还是无符号。

作为带符号的二进制补码32位数的十六进制表示,它是负数。

答案 3 :(得分:0)

否定,我认为。最左边的位是符号位。 (“我认为”因为我需要检查ARM使用的表示,但几乎没有任何东西使用其他可能性。)