我是汇编新手,有一个关于如何表示负数的问题。我有三个DWORDS变量,假设:
result DWORD 0
i DWORD 3
j DWORD 5
我想计算这个公式:result = i - j + 8,但是当我做i-j时,由于符号的原因,结果会非常大,那么最终该如何使结果正确呢?
我是汇编新手,有一个关于如何表示负数的问题。我有三个DWORDS变量,假设:
result DWORD 0
i DWORD 3
j DWORD 5
我想计算这个公式:result = i - j + 8,但是当我做i-j时,由于符号的原因,结果会非常大,那么最终该如何使结果正确呢?
32位DWORD的整数范围是从-2147483648到2147483647,或用十六进制表示为-0x80000000到0x7FFFFFFF。
因此,数字-1表示为0xFFFFFFFF。(就像计数器下溢一样)
如果高位(31位)被设置,则该数为负数。要将负数变成正数(取反),您必须对数进行补码操作并加上1。
示例:
0xFFFFFFFE //-2
xor 0xFFFFFFFF //binary complement
---------------
0x00000001 //result of complement
+ 0x00000001 //add 1
---------------
0x00000002 //Result of negation is 2
p (int)$eax
,则此方法在精神上非常有用。如果您要编写一个程序来执行此操作,则可以从0中减去它,例如x86中的 neg eax
或ARM中的 rsb r2,r1,#0
(反向减法,即 r2 = 0-r1)。 - Peter Cordes注意:
如果你要比较两个整数,你需要使用其他跳转命令而不是比较绝对值:
比较绝对值:
jg (jump if greater)
jl (jump if less)
比较整数(可以是负数或正数):
ja (jump if greater)
jb (jump if less)