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之类的比较或位测试指令。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
2021-10-21 opencv-滑动条createTrackbar
2021-10-21 opencv-阈值分割-threshold
2020-10-21 qt-QPixmap