热门问题
时间线
聊天
视角

进位旗标

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

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