Jis*_*han 0 x86 assembly masm conditional-statements eflags
设置均值flag value = 1和未设置均值flag value = 0
现在我了解有几种方法可以在MASM中设置和取消设置标志,如下所示:
test al,0 ; set Zero flag
and al,0 ; set Zero flag
or al,1 ; clear Zero flag
Run Code Online (Sandbox Code Playgroud)
同样适用于Sign flag:
or al,80h ; set Sign flag
and al,7Fh ; clear Sign flag
Run Code Online (Sandbox Code Playgroud)
要设置Carry flag,我们使用STC指令; 要清除Carry标志,我们使用CLC:
stc ; set Carry flag
clc ; clear Carry flag
Run Code Online (Sandbox Code Playgroud)
要设置Overflow flag,我们添加两个产生负和的正值.要清除Overflow flag,我们OR操作数为0:
mov al,7Fh ; AL = +127
inc al ; AL = 80h (-128), OF=1
or eax,0 ; clear Overflow flag
Run Code Online (Sandbox Code Playgroud)
在Overflow和Carry标志操作是自我理解和容易掌握,但我觉得很难理解其背后设置的数学Zero/Sign标志.任何帮助表示赞赏!
谢谢!
使用标志的重点是它们是其他操作的副作用 - 您可以在操作发生后测试结果.
因此,例如,您可以倒计时,10而0无需显式测试零:
mov cx, 10
Again:
; Do some stuff, not changing cx
dec cx
jnz Again ; Go back to Again if not zero
Run Code Online (Sandbox Code Playgroud)
"做一些事情"发生了十次,因为dec影响了Z旗帜.
其原因stc和clc存在是帮助多位数的运算.该C标志用于跟踪先前算术中的"进位",以便您可以将它们分解为将来的操作:
op1 dd 0x12345678 ; 32-bit value
op2 dd 0x9abcdef0 ; 32-bit value
mov ax,[op1+0] ; Get low word of op1
mov dx,[op1+2] ; Get high word of op1
add ax,[op2+0] ; Add in low word of op2
adc dx,[op2+2] ; Add in high word of op2 - WITH CARRY!
Run Code Online (Sandbox Code Playgroud)
由于这些类型的操作,您可能需要预先加载C有0或1开始对算法之前.因此,clc和stc-为什么没有其他(算术)标志有一个"设置"或"清除"操作码.
请注意,还有其他非算术标志:
D(方向)标志控制的字符串指令诸如方向STOS和MOVS.因此有cld和std指示.I(中断)标志用于控制中断是否启用.因此有cli和sti指示.