2011-04-11 84 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)相同,進位可被忽略(這表明有符號運算正確發生)。一種想法可能不是很精確,但我認爲有用的是,負二進制補碼中的前導補碼與非負二進制補碼中的前導零相同。