热门问题
时间线
聊天
视角
進位旗標
来自维基百科,自由的百科全书
Remove ads
進位旗標(carry flag)簡稱為C,是處理器裡狀態暫存器的位元,表示算術邏輯單元計算之後,有出現進位或借位的情形。進位旗標讓處理器可以分段處理數值的相加減,先加減最低有效的運算單位(位元或是字),所得的進位再和較高有效位相加減即可。這一般會在組合語言或是機械的的級別處理,也可能在處理器內部直接用邏輯閘或微程序,也有一些處理器本身就有大於ALU寬度的暫存器或是指令[1]。進位旗標也可以類似的方式擴展位操作和位旋轉。針對減法運算,有兩種不同的處理方式,大部份的處理器在有借位時設定進位旗標,而像MOS 6502和PIC等處理器則是在有借位時,會清除進位旗標。
用法
大部份的算術指令(以及許多的位元處理指令)會影響進位旗標,進位旗標也是許多指令的輸入。許多指令都有二個版本,一個考慮進位指令,另一個忽略進位命令。匯編語言中這些指令會用助憶碼表示,像是ADD/SUB
、ADC/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
的加法,結果是111111110
,Carry_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_Flag
和Sign_Flag
。
另一個例子是8-bit寄存器裡的數值是01010101
,有設定進位旗標。若進行考慮進位的左旋轉指令,其結果會是10101011
,進位旗標為0,因為原來的最高位元旋轉到進位旗標,而進位旗標旋轉到最低位元。
早期的微處理器Intel 4004和Intel 8008有特別的指令可以設定和清除進位旗標。但較晚期的Intel 8080(和Z80)沒有特別清除進位旗標的指令,因為用位元的AND, OR或XOR指令也可以有一樣的效果(這些指令不會用到進位旗標)。
進位旗標也常用在比較指令中,一般會用減法指令實現,可以知道兩個比較的數字,某一個是否比另一個要小。考慮進位旗標的分支,其助憶碼是BCC
and BCS
,前者在沒有進位旗標時分支,後者在有進位旗標時分支。此方法可以比較無號數,而溢位旗標是用來比較有號數的大小。
Remove ads
借位旗標
進位旗標在加法裡有明確的定義,而在減法中,有兩種使用進位旗標的方法。
第一種方法把進位旗標當作借位旗標使用。在計算a−b時,若a<b,需要借位,則設定旗標。SBB
指令是考慮借位的減法,會計算a−b−C = a−(b+C),而SUB
指令是不考慮借位的減法,其運算就像借位旗標為0一樣。6800、680x0、8051、8080/Z80和x86[2]系列都是用此處理方式。
第二種方法直接使用−x = (not x)+1(不儲存反相的進位位元),因此將a−b轉換為a+(not b)+1來計算。在此加法中,有設定進位旗標,而其考慮進位的減法會計算a+not(b)+C,不考慮進位的減法計算時就像有設定進位位元一樣。因此,當a≥b時會設定進位旗標,若a<b時會清除進位旗標。System/360[3]、ARM、POWER/PowerPC、6502、MSP430、COP8、Am29000、i960和88000處理器都使用此作法。6502是特別多人知道的範例,因為此處理器沒有不考慮進位的減法指令,因此程式設計者需在每一個減法之前檢查,若不需考慮借位,要確認進位旗標已設定[4]。
上述所列的處理器,其中包括過去數十年流行的處理器,將其運算稱為「考慮借位的減法」和「考慮進位的減法」。但命名很不一致。VAX、NS320xx、Fairchild Clipper和Atmel AVR架構使用借位位元的命名方式,但是稱其a−b−C運算是「考慮進位的減法」(SBWC
, SUBC
, SUBWC
, SBC
)。PA-RISC和PICmicro架構是用進位位元的命名方式,但稱a+not(b)+C運算是「考慮借位的減法」(SUBB
和 SUBWFB
)。其他處理器,像是H8系列,稱其減法為擴充減法(SUBX
)。SPARC用借位的作法,SUBX
助憶詞、以及「考慮進位的減法」名稱。
Remove ads
相關條目
參考資料
外部連結
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads