如何在汇编中计算负数

4

我是汇编新手,有一个关于如何表示负数的问题。我有三个DWORDS变量,假设:

result DWORD 0
i DWORD 3
j DWORD 5

我想计算这个公式:result = i - j + 8,但是当我做i-j时,由于符号的原因,结果会非常大,那么最终该如何使结果正确呢?


1
“OK”是什么意思?正如你所说的,“high number”将是适当的结果。 - Brian Knoblauch
1
Brian是正确的,你的高数字实际上只是结果的有符号版本。如果你认为它是“非常高”的话,你可能只是显示了无符号版本。 - Josh Weatherly
3个回答

11

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

如果您不想告诉调试器将其打印为有符号十进制数,例如GDB中的 p (int)$eax,则此方法在精神上非常有用。如果您要编写一个程序来执行此操作,则可以从0中减去它,例如x86中的 neg eax 或ARM中的 rsb r2,r1,#0(反向减法,即 r2 = 0-r1)。 - Peter Cordes

0
在汇编语言中,负数是用补码来表示的。要获得一个数的补码,有两种选择:
- 把所有位取反并加一。 - 把除最后一个1以外的所有位取反。

0

注意:

如果你要比较两个整数,你需要使用其他跳转命令而不是比较绝对值:

比较绝对值:

jg (jump if greater)
jl (jump if less)

比较整数(可以是负数或正数):

ja (jump if greater)
jb (jump if less)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接