2014-02-18 51 views
1

快速提問,我正在閱讀Richard C. Detmer編寫的題爲「80x86彙編語言和計算機體系結構導論」的教科書,並且在第21和22頁中討論了什麼是借用的概念,但它並不真正描述它到底是什麼。下面是正文:什麼是十六進制減法的借用? (Assembly)

在計算機中,數字a和b的減法a-b通常通過取b的2的補碼並將結果添加到a中來執行。這對應於添加b的否定。例如,對於小數減法195 - 618 = -423,

00C3 - 026A

被改變爲另外FD96,在2的的026A補體。

00C3 + FD96 = FE59

的十六進制數字表示FE59 -423。看看前面的除了二進制,你有

0000 0000 1100 0011 1111 + 1101 1001 0110 1111 = 1110 0101 1001

注意,有一個在除進位。然而,這種減法確實涉及借用。 A 借用發生在減法a - b時,b大於a的無符號數。計算機硬件可以通過查看相應加法中是否出現進位來檢測減法中的借位。如果在加法中沒有進位,則在減法中有借用。如果在加法中有進位,那麼在減法中沒有借用。 (請記住,「攜帶」本身就意味着「執行」。)

這裏還有一個例子。這樣做的十進制減法985 - 411 = 574使用字長度爲2的補數表示,

03D9 - 019B

更改爲另外的FE65,2的019B的補充。

03D9 + FE65 = 1023E

0000 0011 1101 1001 + 1111 1110 0110 0101 = 1 0000 0010 0011 1110

丟棄額外的1,十六進制數字表示023E 574.該添加有進位,所以在相應的減法中沒有借用。

真的是減法借用?我認爲當例如00C3 - 026A,A大於3時,所以我們必須從相應的C中「借」到B,並且現在使它成爲13(基數16)減A.我們可以這樣做,但是發生了「借用」。在這個特定的例子中,本書的背景中發生了借閱。但是當我們看下一個例子時,他們給了我們03D9 - 019B,B比9大,所以我們必須從D中「借」下來,使它成爲C並且使9 19(基數16)減去B.我們可以這樣做,併發生「借貸」,但該書表示借款沒有發生。

什麼是借用?我知道你知道如果一個運動發生在加法中,但是做了原始減法,那麼真的是一個借用。我什麼時候可以確定是否發生了?

例如,您知道進位是因爲有一個額外的十六進制數字。長度超出了你的兩個十六進制數字的長度(需要保持的長度)。

謝謝。

-Dan

+0

書並不總是100%無錯,即使它們是,它們也可能被錯誤地讀取。借用和攜帶一樣。沒什麼大不了的。 –

+0

@MikeDunlavey那麼爲什麼稱它爲借用?爲什麼不把它稱爲隨身攜帶? –

+0

因爲在小學學習了運用和借的加減法。在計算機中,AB只是A +( - B),所以它首先否定B然後它使用進位來增加,但是你想把它看作減法,這是一個借位.. –

回答

2

採取一些4位數字,以使其更容易,位數不事關32位工作方式相同,只是多列...

實際上,我們不減去我們添加了負數A - B = A + (-b),並且我們知道,對於「反轉並添加一個」的數字來說,二進制補碼是負數。

所以減去7 - 5我們要添加0111 +((〜0101)+ 1)

 1 plus one 
    0111 
+ 1010 inverted 0101 
======= 

我們反轉第二操作數0101變爲1010和在第一列中的進位是一個。

光潔度數學

11111 
    0111 
+ 1010 
======= 
    0010 

所以答案爲0010是2位小數。這是正確的答案。現在,如果原始執行位是1,那意味着沒有借貸。我看到原始的,因爲一些體系結構,如果操作是一個減法,將它放入處理器狀態寄存器進位標誌時,會反轉原始執行。一些架構做一些,不要,只要你知道它是如何工作的,並可以創建一個簡單的測試,你沒有記住...

現在走另一條路5 - 7

00011 
    0101 
+ 1000 (inverted 0111) 
======= 
    1110 

所以答案是否定的,RAW的結果是0表示有借款。如果你的架構顛倒了執行,那麼你會看到這是一個借用...

什麼出來進行一個ADD操作需要匹配什麼進去作爲進位加進位進位操作。如果您的體系結構具有該指令,那麼對於SUB操作出來的操作需要作爲帶借位操作的減法返回。

凡借進場是這5-7 = -2的情況下想到了4位減法的爲

10101 0101 plus a fifth bit there to borrow from if we need it 
- 0111 
======== 
    1110 

如果你減去0x1A的 - 你得到0xE計算器0x7的。我們需要這一點借用,這是讀者嘗試手動執行二進制減法(非常容易)的練習,它只是不是硬件如何,但現在你明白了爲什麼我們使用二進制補碼。

所以一般來說,減法就是使用加法運算,但是在加法運算的過程中將第二個操作數反轉。或者強制進位爲1或反轉進位(反轉進位和反轉第二操作數)。有的反轉執行(反轉進位反轉第2操作數反轉執行相減)。

讀你的其他問題。讓我們採取我們的四位系統,並將其級聯到兩個兩位系統,所以可以說,例如,我們要減去4位數字5 - 3. 0101 - 0011,但我們只有兩個位寄存器和一個兩位加法器。我們必須開始與低位兩個比特第一01 - 11 = 01 +(-01)= 01 +((〜01)+ 1)

設置這樣,減法

1 
    01 
+ 00 
===== 

然後完成數學

011 
    01 
+ 00 
===== 
    10 

所以我們的答案的低兩位爲10,現在我們要級聯的進位與借進行下一步操作減法操作數是01和00(高位0101 - 0011)

110 carry out from lower order operation 
    01 
+ 11 inverted operand 
======= 
    00 

所以我們的整個答案是0010並且執行是1,所以沒有借用。 5-3 = 2有效。

讓我們來看看這種方式爲四位

設置

 1 
    0101 
+ 1100 
======= 

執行

11011 
    0101 
+ 1100 
======= 
    0010 

以拆分成我們實際上在兩個位間隔分成兩份位操作從右邊開始

110 011 
    01 01 
+ 11 00 
==== === 
    00 10 

最右邊,低位操作是一個正常的減法,帶一個固定的1作爲進位。帶有借位的減法用於其他高位的任何進一步操作,並且先前操作的執行是進位當前減去借用。

這就是爲什麼最終執行是重要的,而不是單個的重要,因爲當我們使用處理器執行更大的操作時,執行的操作是倒轉或不進入我們psr中的進位標誌,然後在借用(如果您的處理器有一個)的情況下用作減法中的進位(倒置或非倒數)。

我們可以做一個,其中搭載的是一,以及... 5 - 1

四位設置

 1 
    0101 
+ 1110 
======= 

四位執行

11111 
    0101 
+ 1110 
======= 
    0100 

然後從字面上拆分進入兩位操作,看看如果我們有2位寄存器和alu而不是4位,看起來如何。

111 111 
    01 01 
+ 11 10 
==== === 
    01 00 

右邊的執行成爲減去和借入的進位。如果處理器體系結構在進入psr中的進位位時將原始執行進行反轉,那麼該體系結構也會在進入減去借位時將其反轉。

有時處理器文檔是這樣的,你可以從有符號和無符號的分支中得知,如果小於或大於等,進位標誌是否反轉。有時做一個實驗比較容易。

+0

借款意味着如果您將此作爲傳統的減法操作,則頂部數字越小,您將繼續從左邊的數字中借款,但您的數字用完,因此您會從頂部的左端進行虛擬借入號碼,以使其全部解決。對於這個4比特的東西,可以考慮5 - 7而不是0101 - 0111,而是10101 - 0111,這樣你就可以從 –

+0

那裏借一點錢了。當你在第一個例子中倒置0101的時候,你永遠不會添加一個。你先倒轉到1010,這是十六進制的A,然後加1,得到1011,這是十六進制的B。你爲什麼不加一個? 此外,爲什麼在處理減法時體系結構會顛倒位?我仍然對這個原因感到困惑 –

+0

我做了一個添加一個它的進位是一個「添加一個」,就是你如何在邏輯上做一個加法器減去,你在加法器中反轉第二個操作數,你把一個1作爲「增加一個」作爲進位。在第一個例子中,查看第一位頂部的1位是第一位列的進位位。 –

3

在這本書中,他呼籲借是借的傳統定義不同。他說只有在減法的結果是否定的(換句話說,b> a)時纔會出現借位,而不一定是個別位數的借位。

+0

爲什麼他會這樣定義它,但是,我不知道 –

+4

因爲這是你在C中找到的東西國旗 – harold

+0

啊哈!那就解釋了那個。謝謝@harold –