当寄存器的结果太大时,进位和溢出标志的行为如何



以下示例应设置进位和溢出标志:

mov eax, -120
add al, 140

add al, 140将类似于位中的以下操作:

10001000
+10001100
---------
= 100010100

因此结果有9个比特,而可以放入CCD_ 2中的最大比特数量是8。但我理解CCD_ 3的方式是,它仅在运算结果为"0"时设置;错误";。例如,当将正数与正数相加,但随后设置了sign-flag,从而产生负结果时。

关于到目前为止我所做的例子中的进位标志,我只在从较大的值中减去较小的值时设置它。

因此,我的问题归结为当运算的大小无法在寄存器中表示时,进位和溢出标志的行为。

好的,这里的问题是计算机数据类型的工作方式和您正在做的事情不匹配。

一般来说,计算机可以处理(即添加(有符号数据类型或无符号数据类型,但要求它将有符号值添加到无符号值可能会有问题。

这里,-120是负数,所以必须使用带符号的表示。

然而,140本身不适合8位有符号,因此在8位中,必须使用无符号表示。

硬件不支持这种组合——虽然加法会产生截断的结果,但如果执行8位加法,硬件将不会在标志中提供有意义的信息。

(如果两个操作数都是有8位符号的,或者如果两个运算数都是8位无符号的,则8位加法的标志是有意义的,但在混合两种数据类型时,它们并不总是有意义的:特别是当涉及的值足够大,以至于使用了高位时,如-120有符号8位和140的情况(

在这里获得正确结果的方法是将两个数字转换为更大的数据大小,以容纳两个数字(它将是一种有符号的数据类型,因此可以容纳-120,当然,转换方法因两个操作数是不同的数据类型而不同(。

因此,通过符号扩展将-120从8位转换为16位(或更大(。

并且,通过零扩展将140从8位转换为16位(或更大(。

然后,您可以执行加法并获得一个带符号的结果,该结果带有一个有意义的溢出标志。当然,特定的计算不会在16位中溢出——事实上,以两个8位值开始的16位加法不会溢出。

然而,如果你想把它恢复到8位,你可以检查一下它是否适合这个大小&数据类型。出于所有实际目的,在这种情况下,16位结果的高8位包含关于低8位结果的感兴趣的溢出信息,而不是标志中的信息(溢出/进位(。

首先,决定要检查哪种8位数据类型:有符号还是无符号。有几种方法是可行的,但一种简单的方法是将16位值截断为8位,然后将其从8位扩展回16位,并查看新扩展的16位是否等于原始的16位结果。

对于带符号的8位,您可以将16位的结果截断为8位,然后将其符号扩展回16位,然后与原始的16位值进行比较。如果不同,则该值不适合带符号的8位。

无符号8位也是如此:将16位的结果截断为8位,然后零扩展回16位以与原始结果进行比较,如果比较不相等,则不适合无符号的8位。

或者,根据16位原始结果,您可以检查低位8位值的符号位和高位8位的值。如果所有的高位比特都与低位8比特的符号比特具有相同的比特值,则16比特的结果将适合于有符号的8比特而不会丢失。

对于无符号,如果高8位为0,则低8位将适合于8位无符号,而不会丢失。

最新更新