Assembly 携带标志汇编语言

Assembly 携带标志汇编语言,assembly,x86,masm,irvine32,carryflag,Assembly,X86,Masm,Irvine32,Carryflag,为什么在此代码中进位标志设置为255 INCLUDE Irvine32.inc .data .code main PROC ;adding 1 to 255 rolls AL over to zero: mov al,255 add al,1 ; AL=0, CF=1 (unsigned overflow) call DumpRegs ;subtracting larger number from smaller: sub al,1 ; AL=255, CF=1 call Dum

为什么在此代码中进位标志设置为255

INCLUDE Irvine32.inc
.data
.code
main PROC

;adding 1 to 255 rolls AL over to zero:
mov al,255
add al,1    ; AL=0, CF=1 (unsigned overflow)
call DumpRegs

;subtracting larger number from smaller:
sub al,1    ; AL=255, CF=1
call DumpRegs

;subtracting 1 from 255
sub al,1    ; AL=254, CF=0
call DumpRegs

exit
main ENDP
END main
可能是溢出和进位混淆了,但既然1111111在二进制中是255,进位不应该只设置为256吗?

nasm语法:

莫夫·艾尔,255 sub al,1

莫夫艾尔,254 sub al,1

mov al,1 sub al,255

mov al,1 sub al,254

我得到的CFs为0,0,1,1

这就是你所期望的,对吗?减法实现为逆变和加1,对第二个数字进行补,进位为1而不是零。0xFF+0xFE+1=0x1FE,作为x86上的减法运算,它是一个借位,因此进位对于子对象是反向的。因此进位标志是0。0xFE+0xFE+1也是如此。但对于0x01+0x00+1=0x002,0的进位变成1的进位标志。0x01+0x01+1=0x003执行0变为执行标志1


您确定这些是ax进入的值吗?

有两个标志用于跟踪值溢出的时间

一个是CF的无符号溢出,另一个是的有符号溢出

当您进行的加法超过寄存器可容纳的最大值时,将设置CF标志。在您的情况下,任何超过255的加法

对于减法,同样的事情,相反。如果你减法,它小于0,那么你得到一个进位

CF标志允许您对非常大的数字进行添加,而无需专门的代码:

add eax, ebx
adc ecx, edx
这会将两个32位数字(eax和ebx)相加,然后再将另一组32位数字(ecx、edx)计入进位。结果是表示64位数字的ebx/edx。您可以将其用于任何大小的数字(即,您可以编写代码来添加两个1024位的数字)

如果您的数字是无符号的,您可以在末尾添加一个
jc溢出
,如果它跳转,那么您就有一个溢出(您的数字在添加后需要65位)

OF标志总是设置的,但是,它通常只在最后一次添加时使用,以了解您的号码被签名时是否溢出。如果您的数字总是无符号的,那么OF永远不会在代码中使用(显然,处理器总是设置为,无论发生什么,因为它不知道您使用的是有符号的还是无符号的数字。)

因此,在我们之前的添加中,您将执行以下操作:

add eax, ebx
adc ecx, edx
jo overflow

发生跳转到溢出时,64位加法不适合64位数字。你需要65位。这可以用来生成一个异常,并让用户知道他的数学是错误的。当然,OF标志将对AL起作用,在这种情况下,该值被视为介于-128和+127之间的数字。如果一个加法生成的数字大于127,或者一个减法生成的数字小于-128,那么OF就会被设置。

你说的是哪一行?