高级语言常见的if语句如下:

if(表达式1)语句1;
else  if(表达式2) 语句2;
else  if(表达式m) 语句m;
else语句n;

MASM的IF伪指令

MASM也有类似写法的伪指令,但汇编器会在后台生成CMP和条件跳转指令。使用与C++和JAVA相同的运算符 ( 比如:<、>、== 和 !=)。表达式在运行时计算。下面的例子给出了一些有效的条件,使用的是 32 位寄存器和变量:

eax > 10000h
val1 <= 100
val2 == eax
val3 != ebx(eax > 0) && (eax > 10000h)
(val1 <= 100) || (val2 <= 100)
(val2 != ebx) && !CARRY?
所有的关系和逻辑运算符
运算符 说明
expr1 == expr2 若 expr1 等于 expr2,则返回“真”
expr1 != expr2 若 expr1 不等于 expr2,则返回“真”
expr1 > expr2 若 expr1 大于 expr2,则返回"真”
expr1 ≥ expr2 若 expr1 大于等于 expr2,则返回“真”
expr1 < expr2 若 expr1 小于 expr2,则返回“真”
expr1 ≤ expr2  若 expr1 小于等于 expr2,则返回“真”
!expr1  若 expr 为假,则返回“真”
expr1 expr2 对 expr1 和 expr2 执行逻辑 AND 运算
expr1 || expr2 对 1xprl 和 expr2 执行逻辑 OR 运算
expr1 & expr2 对 expr1 和 expr2 执行按位 AND 运算
CARR1? 若进位标志位置 11则返回“真”
OVERFLOW ? 若溢出标志位置 1,则返回“真”
PARITY ? 若奇偶标志位置 1,则返回“真”
SIGN ? 若符号标志位置 1,则返回“真”
ZERO ?  若零标志位置 1,则返回“真”

在使用 MASM 条件伪指令之前,一定要彻底了解怎样用纯汇编语言的指令实现条件分支。此外,在包含条件伪指令的程序汇编中,要查看列表文件以确认 MASM 生成的代码确实是编程者所需要的。

有符号数和无符号数的比较

关于有符号数和无符号数的比较的问题,汇编器根据定义数据的伪指令属于无符号或者有符号,来确定当遇到if伪指令时要用有符号还是无符号的跳转指令。

定义内存数据时需要伪指令如:sdword、dword,当遇到用寄存器与内存数据比较时,可以借此确定用有符号或者无符号跳转指令。但是当遇到寄存器与寄存器的比较,汇编器就无法确定寄存器中的数值是有符号的还是无符号。

复合表达式

很多复合布尔表达式使用逻辑 OR 和 AND 运算符。用 .IF 伪指令时,符号 || 表示的是逻辑 OR 运算符。符号 && 表示的是逻辑 AND 运算符。

.IF expression1 || expression2statements
.ENDIF
.IF expression1 && expression2statements
.ENDIF

SetCursorPosition 示例

下例给出的 SetCursorPosition 过程,根据两个输入参数 DH 和 DL,执行范围检查。Y 坐标(DH)范围必须为 0〜24。X 坐标(DL)范围必须为 0〜79。不论发现哪个坐标超出范围,都显示一条错误消息:

SetCursorPosition PROC
; 设置光标位置
; 接收: DL = X坐标, DH = Y坐标
; 检查 DL 和 DH 的范围
; 返回:无
;------------------------------------------------
.data
BadXCoordMsg BYTE "X-Coordinate out of range!",0Dh,0Ah,0
BadYCoordMsg BYTE "Y-Coordinate out of range!",0Dh,0Ah,0
.code.IF (DL < 0) || (DL > 79)mov  edx,OFFSET BadXCoordMsgcall WriteStringjmp  quit.ENDIF.IF (DH < 0) || (DH > 24)mov  edx,OFFSET BadYCoordMsgcall WriteStringjmp  quit.ENDIFcall Gotoxy
quit:ret
SetCursorPosition ENDP

MASM 对 SetCursorPosition 进行预处理时,生成代码如下:

.code
;.IF (dl < 0) || (dl > 79)cmp dl, OOOhjb @C0002cmp dl, 04Fhjbe @C0001
@C0002:mov edx,OFFSET BadXCoordMsgcall WriteStringjmp quit
;.ENDIF
@C0001:
;.IF (dh < 0) || (dh > 24)cmp dh, OOOhjb @COOO5cmp    dh, 018hjbe @C0004
@COOO5:mov edx,OFFSET BadYCoordMsgcall WriteStringjmp quit
;.ENDIF
@C0004:call Gotoxy
quit:ret

大学注册示例

假设有一个大学生想要进行课程注册。现在用两个条件来决定该生是否能注册:第一个条件是学生的平均成绩,范围为 0〜400,其中 400 是可能的最高成绩;第二个条件是学生期望获得的学分。可以使用多分支结构,包括 .IF、.ELSEIF 和 .ENDIF。示例如下。

.data
TRUE = 1
FALSE = 0
gradeAverage  WORD 275    ; 要检查的数值
credits       WORD 12     ; 要检查的数值
OkToRegister  BYTE ?
.code
main PROCmov OkToRegister,FALSE.IF gradeAverage > 350mov OkToRegister,TRUE.ELSEIF (gradeAverage > 250) && (credits <= 16)mov OkToRegister,TRUE.ELSEIF (credits <= 12)mov OkToRegister,TRUE.ENDIF

对应的汇编代码如下:

.386
.model flat, stdcall
.stack 4096
ExitProcess proto, dwExitcode:dword
include irvine32.inc.data
true = 1
false = 0
gradeAverage  word 215    ; 要检查的数值
credits word 12     ; 要检查的数值
OkToRegister byte ?.code
main procnopmov byte ptr OkToRegister, false  ;false是一个立即数,默认为32位,此处用byte ptr。cmp gradeaverage, 350jbe @001jmp finish@001:cmp gradeaverage, 250jbe @002cmp credits, 16jbe finish@002:cmp credits, 12ja quitfinish:mov byte ptr OkToRegister, truequit: ret
main endpend main   

x86汇编_MASM的IF伪指令_笔记44相关推荐

  1. x86汇编_CMP指令_笔记_28

    高级语言常用的比较语句: if A > B ... while X > 0 and X < 200 ... if check_for_error(N) = true x86汇编用cm ...

  2. 【Android 逆向】x86 汇编 ( align | db | dw | dd | nop | 伪指令 )

    文章目录 一.align 字节对齐指令 二.db / dw / dd 指令 三.nop 指令 总结 一.align 字节对齐指令 align 字节对齐 ; 默认情况下是 161616 字节对齐 ; 该 ...

  3. 【操作系统学习笔记(一)】对x86汇编知识做了粗略补充,以及尽力读懂代码片段

    学习参考:B站哈工大李治军老师的网课 前置知识:计组,和x86有亿点点区别的RISC-V指令集. 其他章节笔记: (一)操作系统的启动 (二)系统调用 (三)操作系统历史 (四)多进程管理图像 (五) ...

  4. 寄存器理解 及 X86汇编入门

    本文整理自多材料源,感谢原址分享,请查看末尾Url I, 汇编语言分类: 汇编语言和CPU息息相关,但是不能把汇编语言完全等同于CPU的机器指令.不同架构的CPU指令并不相同,如x86,powerpc ...

  5. x86汇编指令集大全

    一.数据传输指令 1. 通用数据传送指令 MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX ...

  6. 汇编中各寄存器的作用(16位CPU14个,32位CPU16个)和 x86汇编指令集大全(带注释)

    From:https://www.cnblogs.com/zimmerk/articles/2520011.html From:https://blog.csdn.net/bjbz_cxy/artic ...

  7. X86汇编学习小结----cmp 完整版本

    生成汇编代码 比如,一个简单的函数: // hello.c void func(){} 如何得到相应的汇编代码呢? gcc -S hello.c hello.s clang -S hello.c he ...

  8. 汇编中各寄存器的作用(16位CPU14个,32位CPU16个)和 x86汇编指令集大全(带注释)...

    From:https://www.cnblogs.com/zimmerk/articles/2520011.html From:https://blog.csdn.net/bjbz_cxy/artic ...

  9. 【Android 逆向】x86 汇编 ( 参考资料 | Intel 官方的文档 | x86 汇编中文文档 | 汇编指令查询器 )

    文章目录 一.x86 汇编参考文档 1.Intel 官方的文档 2.常用 x86 汇编文档 3.x86 汇编指令查询器 总结 一.x86 汇编参考文档 下面的所有资料 , 都可以在博客资源 https ...

最新文章

  1. Myeclise下tomcat启动报错,启动超时
  2. Error: Most middleware (like bodyParser) ...
  3. ScrollView 嵌套 ListView 只显示第一行的源码分析
  4. web中session与序列化的问题
  5. 【转】首先为人编写程序,其次才是计算机
  6. android使用桢布局,Android性能优化UI篇
  7. C项目实践--俄罗斯方块(2)
  8. MySQL DISTINCT:去重(过滤重复数据)
  9. C#正则表达式开源工具
  10. leetcode[0142]环形链表II,判断是否存在环形链表并找到环形的入口
  11. paip.基于HTML gui界面的javascript JS实现SLEEP。。
  12. 5G模块M.2座子管脚和封装分析
  13. C#使用VS2019打包安装程序(图标修改和默认安装路径修改)
  14. 国外浏览器无法访问apple ID页面,显示502 Bad Gateway,解决方法
  15. docker安装gamit_科学网—ubuntu下安装gamit 安装 - 贺小星的博文
  16. 概率算法中的Monte carlo算法
  17. LVGL lv_msgbox消息对话框(22)
  18. 安卓投屏助手(B1358)之辅助调试
  19. HTML网页设计:三、图像标签之<img>标签
  20. 数据库软件设计(8684)

热门文章

  1. 2022年4月浙江省三级计算机网络与安全技术题型分布
  2. 旋转矩阵转化成四元数的三种算法
  3. citespace快速上手教程(包括相关报错)
  4. Java实现GeoHash算法
  5. Java面向对象系列[v1.0.0][SQL语法之数据库约束]
  6. 2023年6月7日JUC随笔
  7. C#基础学习(二) | 常用快捷键的使用
  8. Word2003模板损坏
  9. 计算机运行内存和内存条吗,电脑运行内存是几个g,怎么看?
  10. 网页美学设计原则(下)