热门问题
时间线
聊天
视角
进位旗标
来自维基百科,自由的百科全书
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