如何设置/取消设置MASM标志的工作原理

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)

OverflowCarry标志操作是自我理解和容易掌握,但我觉得很难理解其背后设置的数学Zero/Sign标志.任何帮助表示赞赏!

谢谢!

Joh*_*ger 5

使用标志的重点是它们是其他操作的副作用 - 您可以在操作发生后测试结果.

因此,例如,您可以倒计时,100无需显式测试零:

       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旗帜.

其原因stcclc存在是帮助多位数的运算.该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)

由于这些类型的操作,您可能需要预先加载C01开始对算法之前.因此,clcstc-为什么没有其他(算术)标志有一个"设置"或"清除"操作码.

请注意,还有其他非算术标志:

  • D(方向)标志控制的字符串指令诸如方向STOSMOVS.因此有cldstd指示.
  • I(中断)标志用于控制中断是否启用.因此有clisti指示.