热门问题
时间线
聊天
视角

進位旗標

来自维基百科,自由的百科全书

Remove ads

進位旗標(carry flag)簡稱為C,是處理器裡狀態暫存器的位元,表示算術邏輯單元計算之後,有出現進位或借位的情形。進位旗標讓處理器可以分段處理數值的相加減,先加減最低有效的運算單位(位元或是字),所得的進位再和較高有效位相加減即可。這一般會在組合語言或是機械的的級別處理,也可能在處理器內部直接用邏輯閘微程序,也有一些處理器本身就有大於ALU寬度的暫存器或是指令[1]。進位旗標也可以類似的方式擴展位操作和位旋轉。針對減法運算,有兩種不同的處理方式,大部份的處理器在有借位時設定進位旗標,而像MOS 6502PIC等處理器則是在有借位時,會清除進位旗標。

用法

大部份的算術指令(以及許多的位元處理指令)會影響進位旗標,進位旗標也是許多指令的輸入。許多指令都有二個版本,一個考慮進位指令,另一個忽略進位命令。匯編語言中這些指令會用助憶碼表示,像是ADD/SUBADC/SBC(考慮 進位的ADD/SUB)、SHL/SHR位操作)、ROL/ROR(位旋轉)、RCR/RCL(考慮進位的位旋轉)等[2]。使用進位旗標可以進行多位元組的加法、減法、移位和旋轉指令。

以在8位元暫存器中將255加255做例子,其結果是510,二進制下是9位元111111110。較低的8位元可以存在暫存器內,結果是二進制的11111110(十進制的254),但其最高位元有進位,設定進位旗標,代表其結果需要9位元才能儲存。9位元的結果就是進位旗標和原暫存器串接為9位元所得的值。

x86的ALU寬度是8位元,用8位元二補數表示法表示11111111 + 11111111的加法,結果是111111110Carry_Flag為1,Sign_Flag為1,Overflow_Flag為零。

11111111表示二補數下的有號整數−1(ADD al,-1),則結果即為-2,因為Overflow_Flag沒有設定,且忽略Carry_Flag。結果的符號為負,因為Sign_Flag有設定。11111110是有號整數-2在二補數下的寫法'。

11111111表示無號整數255(ADD al,255),則其結果是254,此結果不正確,因為最高位元的相加結果進位到進位旗標了Carry_Flag,因此此旗標不能省略。此時要省略Overflow_FlagSign_Flag

另一個例子是8-bit寄存器裡的數值是01010101,有設定進位旗標。若進行考慮進位的左旋轉指令,其結果會是10101011,進位旗標為0,因為原來的最高位元旋轉到進位旗標,而進位旗標旋轉到最低位元。

早期的微處理器Intel 4004Intel 8008有特別的指令可以設定和清除進位旗標。但較晚期的Intel 8080(和Z80)沒有特別清除進位旗標的指令,因為用位元的AND, OR或XOR指令也可以有一樣的效果(這些指令不會用到進位旗標)。

進位旗標也常用在比較指令中,一般會用減法指令實現,可以知道兩個比較的數字,某一個是否比另一個要小。考慮進位旗標的分支,其助憶碼是BCC and BCS,前者在沒有進位旗標時分支,後者在有進位旗標時分支。此方法可以比較無號數,而溢位旗標是用來比較有號數的大小。

Remove ads

借位旗標

進位旗標在加法裡有明確的定義,而在減法中,有兩種使用進位旗標的方法。

第一種方法把進位旗標當作借位旗標使用。在計算ab時,若a<b,需要借位,則設定旗標。SBB指令是考慮借位的減法,會計算abC = a−(b+C),而SUB指令是不考慮借位的減法,其運算就像借位旗標為0一樣。6800680x0英語Motorola 68000 series80518080/Z80x86[2]系列都是用此處理方式。

第二種方法直接使用−x = (not x)+1(不儲存反相的進位位元),因此將ab轉換為a+(not b)+1來計算。在此加法中,有設定進位旗標,而其考慮進位的減法會計算a+not(b)+C,不考慮進位的減法計算時就像有設定進位位元一樣。因此,當ab時會設定進位旗標,若a<b時會清除進位旗標。System/360[3]ARMPOWER/PowerPC6502MSP430COP8Am29000英語AMD Am29000i96088000處理器都使用此作法。6502是特別多人知道的範例,因為此處理器沒有不考慮進位的減法指令,因此程式設計者需在每一個減法之前檢查,若不需考慮借位,要確認進位旗標已設定[4]

更多信息 進位或借位, 不考慮進位/借位的減法 ...

上述所列的處理器,其中包括過去數十年流行的處理器,將其運算稱為「考慮借位的減法」和「考慮進位的減法」。但命名很不一致。VAXNS320xx英語NS320xxFairchild Clipper英語Fairchild ClipperAtmel AVR架構使用借位位元的命名方式,但是稱其abC運算是「考慮進位的減法」(SBWC, SUBC, SUBWC, SBC)。PA-RISCPICmicro架構是用進位位元的命名方式,但稱a+not(b)+C運算是「考慮借位的減法」(SUBBSUBWFB)。其他處理器,像是H8系列,稱其減法為擴充減法(SUBX)。SPARC用借位的作法,SUBX助憶詞、以及「考慮進位的減法」名稱。

Remove ads

相關條目

參考資料

外部連結

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads