2011-04-11 126 views
0

所以这本书“一步一步的汇编语言”真的很棒,但是在实际的内存和寄存器数据工作时,它的工作原理有点神秘。除此之外,我不确定签名值在内存中是如何表示的,我觉得这可能会让我感到困惑。 anywho ...ASM问题,二进制补码

它说:“-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?还是这本书只是一句措辞不佳的解释,它真的意味着它给了你需要引起溢出的价值?

谢谢!

回答

1

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

假设我们有11h。

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

请注意,256与字节工作,因为他们是8位大小。对于16位字,你可以使用2^16(65536),对于dword 2^32。另外请注意,所有的数学模256个字节,65536短裤等

或者,使用不/ + 1,

~11h = EEh 
+1... EFh 

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

+0

感谢快速反应的家伙!好吧,我明白了。所以现在我的问题是,这种表示法完成了什么?为什么有一个和两个的补充? – 2011-04-11 23:41:01

+0

补码是常见的,因为它是一种表示有符号数的非常方便的方式。 'x - y == x + -y',一致。我不确定补码是什么,除了在IP中用作校验和(IIRC)。 – cHao 2011-04-12 00:16:37

+0

@zero:我的回忆是二进制补码,通常用于补码,因为它在硬件实现方面稍微简单一些(它在硬件逻辑中需要较少的特殊情况来进行减法或某物)。它还具有只有一个表示为零的优点(补码也具有“负零”)。我能想到的补码唯一的缺点是,你可以得到一个比负数少的正数。例如,有符号字符可以下降到“-128”,但只能上升到“127”。负的零必须去某个地方...... – 2011-04-12 18:15:37

0

这本书在说“-1 = $ FF”时说什么?

如果考虑一个字节而已,1二进制补码是0xff(或$FF如果使用十六进制数字,格式)。

要打破它的1补(或一个补)是0xfe,然后添加1得到补:0xff

同样,对于2:补为0xfd,加1得到二进制补码:0xfe

现在我们来看十进制数17。正如你所说,这是0x11。补码是0xee,补码是0xef - 所有符合你在你的问题中陈述的内容。

现在,试着将数字加在一起时会发生什么。首先十进制:

17 + (-17) == 0 

现在十六进制:

0x11 + 0xef == 0x100 

因为我们正在处理的是在大小只有一个字节的数值对象,在0x1001被丢弃(一些挥手这里。 ..),我们会导致:

0x11 + 0xef == 0x00 

为应对“挥手”(我可能不会做以简单易懂的方式,不幸地):因为溢出标志(OF或有时由于我不知道的原因而被称为V)与进位标志(C)相同,进位可被忽略(这表明有符号运算正确发生)。一种想法可能不是很精确,但我认为有用的是,负二进制补码中的前导补码与非负二进制补码中的前导零相同。