所以这本书“逐步汇编语言”真的很棒,但是在处理实际内存和注册数据时,两个补码的工作方式有点神秘。与此同时,我不确定签名值是如何在内存中表示的,我觉得这可能会让我感到困惑。 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会是怎样的?或者这本书只是一个措辞不好的解释,它真的意味着它会给你带来溢出所需的价值吗?
谢谢!
答案 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的补数中的前导零相同。