ASM问题,两个补充

时间:2011-04-11 23:11:12

标签: nasm

所以这本书“逐步汇编语言”真的很棒,但是在处理实际内存和注册数据时,两个补码的工作方式有点神秘。与此同时,我不确定签名值是如何在内存中表示的,我觉得这可能会让我感到困惑。 anywho ...

它说:“-1 = $ FF,-2 = $ FE等等”。现在我明白数字的二进制补码本身乘以-1,当加到原数时会得到0.因此,FF是二进制的十六进制等效值11111111,十进制数为255。所以我的问题是:当它说“-1 = $ FF”时,这本书是什么意思?这是否意味着-255 + -1会给你0但是它没有明确地设置OF标志?

所以在实践中...假设我们有11h,十进制为17,二进制为00100001。这个值在AL中。 那么我们NEG AL,这将设置CF和SF,并将AL中的值更改为... 239十进制,11101111二进制或EFh?我只是看不出17 * -1会是怎样的?或者这本书只是一个措辞不好的解释,它真的意味着它会给你带来溢出所需的价值吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

在二进制补码中,对于字节,(-x) == (256 - x) == (~x + 1)。 (~对于NOT运算符是C'ish,它会翻转其操作数中的所有位。)

假设我们有11小时。

100h - 11h == EFh
(256 - 17  == 239)

注意,256用于字节,因为它们的大小为8位。对于16位字,您使用2 ^ 16(65536),对于dwords 2 ^ 32。另请注意,对于字节,所有数学都是模数256,对于短路,所有数学都是65536等。

或者,不使用/ + 1,

~11h = EEh
+1...  EFh

此方法适用于各种规模的单词。

答案 1 :(得分:0)

  

当书上写着“-1 = $ FF”时会怎么说?

如果仅考虑一个字节,1的两个补码为0xff(如果使用十六进制数的格式,则为$FF

为了将其分解,1的补语(或一个补码)为0xfe,然后添加1以获得两个补码:0xff

同样适用于2:补码为0xfd,添加1以获得两个补码:0xfe

现在让我们看看17位小数。如你所说,那是0x11。补语为0xee,两者的补语为0xef - 所有这些都与您在问题中所说的一致。

现在,尝试将数字添加到一起时会发生什么。小数点后第一位:

17 + (-17) == 0 

现在是十六进制:

0x11 + 0xef == 0x100

由于我们处理的数字对象只有一个字节大小,1中的0x100被丢弃(有些人挥手......),我们得到:

0x11 + 0xef == 0x00

处理'挥手'(我可能不会以一种可以理解的方式做到这一点,不幸的是):因为溢出标志(OF或有时称为V因为我不喜欢“不知道”与进位标志(C)相同,可以忽略进位(这表明有符号运算正确)。一种可能不太精确的方法,但我认为有用的是,负2的补码数中的前导数与非负2的补数中的前导零相同。

相关问题