1 .条件测试语句
操作符和逻辑运算 操 作 用 途
==
等于
变量和操作数之间的比较
!=
不等于
变量和操作数之间的比较
>
大于
变量和操作数之间的比较
>=
大于等于
变量和操作数之间的比较
<
小于
变量和操作数之间的比较
<=
小于等于
变量和操作数之间的比较
&
位测试
将变量和操作数做“与”操作
!
逻辑取反
对变量取反或对表达式的结果取反
&&
逻辑与
对两个表达式的结果进行逻辑“与”操作
||
逻辑或
对两个表达式的结果进行逻辑“或”操作
x==3
eax!=3
(y>=3)&&ebx
(z&1)||!eax
MASM 的条件测试采用的是和 C 语言相同的语法。 对于不含比较符的单个变量或寄存器, MASM 也将所有非零值认为是“真”,零值认为是“假”
MASM 的条件测试语句有几个限制:
( 1 )表达式的左边只能是变量或寄存器,不能为常数;
( 2 )表达式的两边不能同时为变量,但可以同时是寄存器。
这些限制来自于 80x86 的指令,因为条件测试伪操作符只是简单地把每个表达式翻译成 cmp 或 test 指令, 80x86 的指令集中没有 cmp 0,eax 之类的指令,同时也不允许直接操作两个内存中的数。
标志位的状态条件测试:
CARRY? 表示 Carry 位是否置位
OVERFLOW? 表示 Overflow 位是否置位
PARITY? 表示 Parity 位是否置位
SIGN? 表示 Sign 位是否置位
ZERO? 表示 Zero 位是否置位
2 .分支语句、只能用于无符号数
3 .循环语句
.while 条件测试表达式
指令
[.break [.if 退出条件 ]]
[.continue]
.endw
或
.repeat
指令
[.break [.if 退出条件 ]]
[.continue]
.until 条件测试表达式 (或 .untilcxz [ 条件测试表达式 ]
.while eax > 1
mov esi,1
.break .if ebx
.continue
mov esi,2
.endw
loop 指令可以自动递减 ecx 的值来控制循环,不使用 loop 将会在循环体内多设置一条参数递减的指令,但不用 loop 指令的好处是带来更多的灵活性。
