x86汇编_MASM的IF伪指令_笔记44
高级语言常见的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相关推荐
- x86汇编_CMP指令_笔记_28
高级语言常用的比较语句: if A > B ... while X > 0 and X < 200 ... if check_for_error(N) = true x86汇编用cm ...
- 【Android 逆向】x86 汇编 ( align | db | dw | dd | nop | 伪指令 )
文章目录 一.align 字节对齐指令 二.db / dw / dd 指令 三.nop 指令 总结 一.align 字节对齐指令 align 字节对齐 ; 默认情况下是 161616 字节对齐 ; 该 ...
- 【操作系统学习笔记(一)】对x86汇编知识做了粗略补充,以及尽力读懂代码片段
学习参考:B站哈工大李治军老师的网课 前置知识:计组,和x86有亿点点区别的RISC-V指令集. 其他章节笔记: (一)操作系统的启动 (二)系统调用 (三)操作系统历史 (四)多进程管理图像 (五) ...
- 寄存器理解 及 X86汇编入门
本文整理自多材料源,感谢原址分享,请查看末尾Url I, 汇编语言分类: 汇编语言和CPU息息相关,但是不能把汇编语言完全等同于CPU的机器指令.不同架构的CPU指令并不相同,如x86,powerpc ...
- x86汇编指令集大全
一.数据传输指令 1. 通用数据传送指令 MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX ...
- 汇编中各寄存器的作用(16位CPU14个,32位CPU16个)和 x86汇编指令集大全(带注释)
From:https://www.cnblogs.com/zimmerk/articles/2520011.html From:https://blog.csdn.net/bjbz_cxy/artic ...
- X86汇编学习小结----cmp 完整版本
生成汇编代码 比如,一个简单的函数: // hello.c void func(){} 如何得到相应的汇编代码呢? gcc -S hello.c hello.s clang -S hello.c he ...
- 汇编中各寄存器的作用(16位CPU14个,32位CPU16个)和 x86汇编指令集大全(带注释)...
From:https://www.cnblogs.com/zimmerk/articles/2520011.html From:https://blog.csdn.net/bjbz_cxy/artic ...
- 【Android 逆向】x86 汇编 ( 参考资料 | Intel 官方的文档 | x86 汇编中文文档 | 汇编指令查询器 )
文章目录 一.x86 汇编参考文档 1.Intel 官方的文档 2.常用 x86 汇编文档 3.x86 汇编指令查询器 总结 一.x86 汇编参考文档 下面的所有资料 , 都可以在博客资源 https ...
最新文章
- Myeclise下tomcat启动报错,启动超时
- Error: Most middleware (like bodyParser) ...
- ScrollView 嵌套 ListView 只显示第一行的源码分析
- web中session与序列化的问题
- 【转】首先为人编写程序,其次才是计算机
- android使用桢布局,Android性能优化UI篇
- C项目实践--俄罗斯方块(2)
- MySQL DISTINCT:去重(过滤重复数据)
- C#正则表达式开源工具
- leetcode[0142]环形链表II,判断是否存在环形链表并找到环形的入口
- paip.基于HTML gui界面的javascript JS实现SLEEP。。
- 5G模块M.2座子管脚和封装分析
- C#使用VS2019打包安装程序(图标修改和默认安装路径修改)
- 国外浏览器无法访问apple ID页面,显示502 Bad Gateway,解决方法
- docker安装gamit_科学网—ubuntu下安装gamit 安装 - 贺小星的博文
- 概率算法中的Monte carlo算法
- LVGL lv_msgbox消息对话框(22)
- 安卓投屏助手(B1358)之辅助调试
- HTML网页设计:三、图像标签之<img>标签
- 数据库软件设计(8684)