【发布时间】:2018-12-13 10:27:26
【问题描述】:
Set 表示flag value = 1,Unset 表示flag value = 0
现在我了解了在 MASM 中设置和取消设置标志的几种方法,如下所示:
test al,0 ; set Zero flag
and al,0 ; set Zero flag
or al,1 ; clear Zero flag
Sign flag 也是如此:
or al,80h ; set Sign flag
and al,7Fh ; clear Sign flag
设置Carry flag,我们使用STC指令;要清除进位标志,我们使用 CLC:
stc ; set Carry flag
clc ; clear Carry flag
要设置Overflow flag,我们将两个正值相加,产生负和。要清除 Overflow flag,我们将操作数与 0 进行或运算:
mov al,7Fh ; AL = +127
inc al ; AL = 80h (-128), OF=1
or eax,0 ; clear Overflow flag
Overflow 和 Carry 标志操作是自懂且易于掌握的,但我发现很难理解设置 Zero/Sign 标志背后的数学原理。任何帮助表示赞赏!
谢谢!
【问题讨论】:
-
也许考虑如何使用标志会有所帮助。考虑一下:你很少需要说你已经溢出了。你做你的工作,然后(根据需要)检查溢出。故意设置标志是……不常见的。但是,进位标志通常用于简单算术之外的目的。比如DOS经常使用CF来表示错误情况。
-
请注意,在大多数示例中,设置标志“只是”操作的副作用,并不意味着设置/清除标志。 (只有
stc和clc明确用于设置/清除标志)。
标签: assembly x86 conditional-statements masm eflags