我查看了很多主题,但无法弄清楚我是否理解这些。
我将使用未签名/签名的符号。
所以,假设我们有一系列单字节数字,[0..255] / [0 ..- 1](2的补码),它是否正确:
Together these flags make the whole range of ADD operation results, from -256 (-128+(-128)) to 510 (255+255), interpretable, instead of, for instance, just having 255+1=0?
- 好吧,那不是真的。UPD:例如,如何在C编程语言中保留符号?是否执行了一些额外的操作来分别存储标志信息?换句话说,为什么它没有做任何奇怪的事情,如下面用0x80 + 0x80?
所示答案 0 :(得分:0)
你是对的,但最后一件事并不是他们的目的。
让我们以Carry Flag为例,在32位机器上添加两个64位数字。
; adds EDX:ECX to EBX:EAX
add eax, ecx
adc ebx, edx
对于第二个双字,第一个操作的进位再次被馈送到加法器。这就像在纸上做的那样保持添加的溢出:3 + 9使2,你记得1为下一个数字。 sbb
(借用减法)是带有进位加法的减法替代。
溢出标志告诉您添加的带符号数字已超过二进制补码边界,并且无法再依赖结果。
负标志与OF一起用于比较两个带符号的数字。
这里已经多次描述了所有标志及其用途。您可以查看this。
答案 1 :(得分:0)
"随身携带" in carry flag具有与学习添加多位数字时相同的含义"携带一个"当添加数字的个别数字的结果为10或更高时。在8位加法的情况下,当操作导致"携带一个"时,设置进位标志。进入不存在的第九位结果。所以,是的,您可以使用进位标志将结果解释为9位值。
当将源操作数解释为有符号值时,当加法的结果不能表示为有符号值时,设置溢出标志。因此,对于8位有符号加法,这意味着结果超出了-128到127的范围。(在8位加法的情况下,溢出标志由XOR实现,从第8位到第9位进位从第七位到第八位的进位。)
然而对于有符号算术,它不是表示结果第九位的溢出标志本身。如果设置了溢出标志,那么进位标志将成为9位有符号值的符号位,否则它将成为第9位的符号标志。
例如,当您执行8位带符号计算-128 + -128(1000 0000b + 1000 0000b
)时,结果为0且设置了进位和溢出标志。如果您假设进位标志是9位有符号值的第9位,则计算结果为-256(1 0000 0000b
)。