win32汇编-条件测试语句
MASM条件测试的基本表达式是:
两个以上的表达式可以用逻辑运算符连接:
允许的操作符和逻辑运算符如表3.5所示。
细心的读者一定会发现, MASM的条件测试采用的是和C语言相同的语法。如!和&是对变量的操作符(取反和“与”操作),Ⅱ和&&是表达式结果之间的逻辑“与”和逻辑“或”,而==、!=、>、<等是比较符。同样, 对于不含比较符的单个变量或寄存器, MASM也是将所有非零值认为是“真”,零值认为是“假”。
MASM的条件测试语句有几个限制, 首先是表达式的左边只能是变量或寄存器, 不能为常数;其次表达式的两边不能同时为变量,但可以同时是寄存器。这些限制来自于80x86的指令, 因为条件测试伪操作符只是简单地把每个表达式翻译成cmp或test指令, 80x86的指令集中没有cmp 0, eax之类的指令, 同时也不允许直接操作两个内存中的数, 所以对这两个限制是很好理解的。
除了这些和高级语言类似的条件测试伪操作,汇编语言还有特殊的要求,就是程序中常常要根据系统标志寄存器中的各种标志位来做条件跳转,这些在高级语言中是用不到的,所以又增加了以下一些标志位的状态指示,它们本身相当于一个表达式:
CARRY? 表示Carry位是否置位
OVERFLOW? 表示Overflow位是否置位
PARITY? 表示Parity位是否置位
SIGN? 表示Sign位是否置位
ZERO? 表示Zero位是否置位
要测试eax等于ebx同时Zero位置位, 条件表达式可以写为:
(eax==ebx) && ZERO?
要测试eax等于ebx同时Zero位清零, 条件表达式可以写为:
(eax==ebx) && ! ZERO?
与C语言的条件测试相同, MASM的条件测试伪指令并不会改变被测试的变量或寄存器的值, 只是进行“测试”而已, 到最后它会被编译器翻译成类似于cmp或test之类的比较或位测试指令。