Math 没有溢出标志的处理器如何执行有符号算术?
我知道,两个大于给定处理器总线大小的无符号整数相加可以通过进位标志实现。通常,使用溢出标志的有符号整数也是如此。然而,Intel 8085只拥有一个符号标志,而不是溢出标志,那么它如何处理有符号整数算法呢 如您所知,溢出标志仅与有符号整数算术相关。在ALU同时具有溢出和进位标志(如x86)的处理器上,这两个标志都是根据二进制算术运算的结果设置的,但如何解释它们则取决于程序员。有符号算术使用溢出标志;无符号算术使用进位标志。看错了,你会得到毫无意义的数据 有两种情况下,溢出标志将在二进制算术运算期间打开:Math 没有溢出标志的处理器如何执行有符号算术?,math,assembly,signed,integer-arithmetic,8085,Math,Assembly,Signed,Integer Arithmetic,8085,我知道,两个大于给定处理器总线大小的无符号整数相加可以通过进位标志实现。通常,使用溢出标志的有符号整数也是如此。然而,Intel 8085只拥有一个符号标志,而不是溢出标志,那么它如何处理有符号整数算法呢 如您所知,溢出标志仅与有符号整数算术相关。在ALU同时具有溢出和进位标志(如x86)的处理器上,这两个标志都是根据二进制算术运算的结果设置的,但如何解释它们则取决于程序员。有符号算术使用溢出标志;无符号算术使用进位标志。看错了,你会得到毫无意义的数据 有两种情况下,溢出标志将在二进制算术运算期
- 0100+0001=0101(溢出标志关闭)
- 0100+0100=1000(溢出标志打开)
- 0110+1001=1111(溢出标志关闭)
- 1000+1000=0000(溢出标志打开)
- 1000+0001=1001(溢出标志关闭)
- 1100+1100=1000(溢出标志关闭)
//对于两个有符号整数的二进制(二的补码)加法,
//如果输入具有相同的符号,并且
//结果的符号与输入的符号不同。
bool GetOverflowFlagForAddition(int op1、int op2、int result)
{
返回(~(op1^op2)和(op1^result))<0;
}
//对于两个有符号整数的二进制(二的补码)减法,
//如果输入具有相同的符号,并且
//结果的符号与输入的符号匹配。
bool GetOverflowFlagForSubtraction(int op1、int op2、int result)
{
返回((op1^op2)和(op1^result))<0;
}
(当然,你可以用很多不同的方法来写这篇文章。)
或者,用“溢出可以定义为符号位进位和进位的异或”这一术语来表述。如果进位不等于该特定(最左边)位的进位,则会发生溢出
更正式的定义是溢出标志是结果高两位执行的异或。象征性地,对于8位值:O=C6^C7,其中O表示“溢出”,而C表示“进位”。这只是对我已经给出的定义的重申:如果进位与进位不同,则会发生溢出(在本例中为第7位)
另请参见(这是在6502的上下文中,另一种流行的8位处理器)
好吧,那么携带旗是什么意思?进位标志表示无符号算术中的溢出情况。再次出现两种设置的情况:
- 1111+0001=0000(带进位标志)
- 0111+0001=1000(进位标志关闭)
- 0000-0001=1111(携带标志打开)
- 1000-0001=0111(进位标志关闭)
- 0000+1111=1111(进位标志打开)
- 1000+1111=0111(进位标志关闭)
将所有这些放在一起,您就完全可以在进位和符号标志方面实现溢出标志。如果有最高有效位(符号位)的进位,则设置进位标志。如果结果设置了符号位,则设置符号标志,这意味着最高有效位有进位。根据我们上面对溢出标志的定义,of==CF^SF,因为溢出是符号位的进位与符号位的进位异或。如果进位不等于进位,则发生有符号溢出 然而,有趣的是,肯·谢里夫的研究表明,事实上,它确实有一个