有的时候我们需要得知计算结果的状态来判断计算结果是否正确,或是根据计算结果的状态执行不同的程序分支.这些状态都保存在标记寄存器中,接下来介绍一些与加减运算有关的标志位.
关于如何查看标志寄存器,请参见009-【X86-汇编语言】-寄存器(Register)
ZR
ZR为零标志位,当计算结果为0时,ZR的值为1
程序演示
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO, dwExitCode:DWORD
.data
.code
MAIN PROC
mov eax,0h ;MOV 不影响标记寄存器,清空eax寄存器
inc al ;al=1h,ZR=0
dec al ;al=0h,ZR=1
add al,0FFh ;al=ffh,ZR=0
add al,1h ;al=0h,ZR=1
add al,0FFh ;al=ffh,ZR=0
sub al,0FFh ;al=0h,ZR=1
add al,0FFh ;al=ffh,ZR=0
inc al ;al=0h,ZR=1
mov al,1h ;MOV 不影响标记寄存器 al=1h,ZR=1
neg al ;al=ffh,ZR=0
mov al,0h ;MOV 不影响标记寄存器 al=0,ZR=0;MOV不影响ZR
neg al ;al=0h,ZR=1
add al,80h ;al=80h,ZR=0
dec al ;al=0h,ZR=1
INVOKE ExitProcess,0
MAIN ENDP
END MAIN
总结
DEC、SUB、INC、ADD的计算结果等于0时,ZR=0.
NEG的目的操作数是0时,ZR=0
思考
当al=0ffh时,再加1(inc,add),为什么结果是0