【汇编语言】转移指令循环指令
转移指令
文章目录
- 转移指令
- 一、无条件转移指令
- (1)JMP指令概述
- (2)JMP指令类型
- 1.段内转移、相对寻址
- 2.段内转移、间接寻址
- 3.段间转移、直接寻址
- 4.段间转移、间接寻址
- (3)条件转移指令的使用
- 1.标号的地址属性
- 2.控制转移
- 二、条件转移指令
- (1)JCC指令概述
- (2)条件转移指令分类
- ①单个标志状态作为条件
- 1.利用零位标志ZF的条件转移指令
- 2.利用进位标志CF的条件转移指令
- 3.利用溢出标志OF的条件转移指令
- 4.利用符号标志SF的条件转移指令
- 5.利用奇偶标志PF的条件转移指令
- ②两数大小关系作为条件
- 1.比较无符号整数大小
- 2.比较有符号整数大小
- (3)产生条件的指令
- 1.比较指令CMP
- 2.测试指令TEST
- 3.其他指令(能够影响状态标志的指令)
- 循环指令
- 一、LOOP指令
- (1)LOOP指令格式
- (2)LOOP指令的应用
- 二、JECXZ指令
一、无条件转移指令
(1)JMP指令概述
JMP 称为无条件转移 (Jump) ,就是无任何先决条件就能使程序改变执行顺序。
- 执行无条件转移指 JMP, 就可以使程序转到指定的目标地址处,从目标地址处开始执行指令。
- JMP 指令相当于高级语言的 GOTO 语句 结构化程序设计要求尽量避免使用GOTO 语句,但指令系统决不能缺少 JMP ,汇编语言编程也不可避免地要使用 JMP 指令。
(2)JMP指令类型
JMP 根据目标地址的转移范围和寻址方式,可以分成4种类型。
- MASM 汇编程序会根据存储模型和目标地址等信息自动识别是段内转移还是段间转移,也能够根据位移 大小自动形成短转移或近转移指令。
- 32 位保护方式使用平展存储模型,不允许应用程序进行段间转移
1.段内转移、相对寻址
JMP label ;EIP=EIP+位移量
段内相对转移 JMP指令 利用标号 (LABEL) 指明目标地址。
- 当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负(补码表示)。
- EIP 指向的偏移地址改变,段寄存器 CS 的内容不变
2.段内转移、间接寻址
JMP r32/rl6 ; EIP = r32/r16 , 寄存器间接寻址
JMP m32/m16 ; EIP = m32/m16 , 存储器间接寻址
段内间接转移 JMP 32 位通用寄存器或主存单元内容(线性地址空间)或者 16位通用寄存器或主存单元内容(实地址存储模型)送入 EIP 寄存器,作为新的指令指针(即偏移地址),但不修改 CS 寄存器的内容。
3.段间转移、直接寻址
JMP label ; EIP = label 的偏移地址,CS= label 的段选择器
段间直接转移 JMP 是将标号所在的段选择器作为新的 CS 值,标号在该段内的偏移地址作为新的 ElP 这样,程序跳转到新的代码段执行.
4.段间转移、间接寻址
JMP m48/m32 ;EIP=m48/m32 , CS =m48+4/m32+2
- 在32位线性地址空间用一个字存储单元 (48 位,使用了符号m48) 表示要跳转的目标地址,将低双字送 EIP 寄存器 CS 寄存器(小端方式);
- 在16位实地址存储模型中,用一个双字存储单元表示要跳转的目标地址,将低字送 EIP 寄存器、高字送入CS 寄存器(小端方式)。
(3)条件转移指令的使用
1.标号的地址属性
使用offset + 标号
获取标号所在指令的地址
指令寄存器间接寻址
mov eax,offset label jmp eax
指令存储器间接寻址
mov eax,offset label mov nvar,eax jmp nvar
2.控制转移
汇编程序提供了短转移SHORT
、近转移 NEAR PTR
和远转移 FAR PTR
操作符,强制转换一个标号、段名或子程序名的类型,形成相应的控制转移。
jmp near ptr label ;强制生成相对寻址的近转移
二、条件转移指令
(1)JCC指令概述
条件转移指令 Jcc 根据指定的条件确定程序是否发生转移,条件满足,发生转移、跳转到 LABEL 位置,即 EIP=EIP+ 位移量。否则,顺序执行下条指令。
语法格式:
Jcc label
label表示目标地址采用段内相对寻址
流程图表示
(2)条件转移指令分类
条件转移指令中的条件是由状态标志决定,共16条指令,分成两类。
①单个标志状态作为条件
5个状态标志ZF、CF、SF、OF和PF的10种状态
1.利用零位标志ZF的条件转移指令
判断条件:运算结果为0、两数相等(标志ZF=1)
JZ label ;Jump if Zero
JE label ;Jump if Equal
判断条件:结果不为0、不相等(标志ZF=0)
JNZ label ;Jump if Not Zero
JNE label ;Jump if Not Equal
2.利用进位标志CF的条件转移指令
判断条件:运算结果有进位(借位)(标志CF=1)
JC label ;Jump if Carry
判断条件:结果没有进位(借位)(标志CF=0)
JNC label ;Jump if Not Carry
3.利用溢出标志OF的条件转移指令
判断条件:运算结果有溢出(标志OF=1)
JO label ;Jump if Overflow
判断条件:结果没有溢出(标志OF=0)
JNO label ;Jump if Not Overflow
4.利用符号标志SF的条件转移指令
判断条件:运算结果是负、最高位为1(标志SF=1)
JS label ;Jump if Sign
判断条件:结果是正、最高位为0(标志SF=0)
JNS label ;Jump if Not Sign
5.利用奇偶标志PF的条件转移指令
判断条件:低8位结果中1的个数为偶或0(标志PF=1)
JP label ;Jump if Parity
JPE label ;Jump if Parity Even
判断条件:低8位结果中1的个数为奇(标志PF=0)
JNP label ;Jump if Not Parity
JPO label ;Jump if Parity Odd
②两数大小关系作为条件
1.比较无符号整数大小
4种情况:低于、不低于、低于等于、高于
无符号数大小用高(Above)、低(Below)助记符
判断条件:低于、不高于等于(标志CF=1)
JB ;Jump if Below
JNAE ;Jump if Not Above or Equal
判断条件:不低于、高于等于(标志CF=0)
JNB ;Jump if Not Below
JAE ;Jump if Above or Equal
判断条件:低于等于、不高于(标志CF=1或ZF=1)
JBE ;Jump if Below or Equal
JNA ;Jump if Not Above
判断条件:不低于等于、高于(标志CF=0且ZF=0)
JNBE ;Jump if Not Below or Equal
JA ;Jump if Above
2.比较有符号整数大小
4种情况:小于、不小于、小于等于、大于
有符号数大小用大(Greater)、小(Less)助记符
判断条件:小于、不大于等于(标志SF≠OF)
JL ;Jump if Less
JNGE ;Jump if Not Greater or Equal
判断条件:不小于、大于等于(标志SF=OF)
JNL ;Jump if Not Less
JGE ;Jump if Greater or Equal
判断条件:小于等于、不大于(标志SF≠OF或ZF=1)
JLE ;Jump if Less or Equal
JNG ;Jump if Not Greater
判断条件:不小于等于、大于(标志SF=OF且ZF=0)
JNLE ;Jump if Not Less or Equal
JG ;Jump if Greater
(3)产生条件的指令
1.比较指令CMP
进行减法运算,用于判断两个数据大小、是否相等
将目的操作数减去源操作数,差值不回送目的操作数,按照减法结果影响状态标志
CMP reg,imm/reg/mem ;reg-imm/reg/mem
CMP mem,imm/reg ;mem-imm/reg
- 根据标志状态获知两个操作数的大小关系
- 给条件转移等指令使用其形成的状态标志
2.测试指令TEST
进行逻辑与运算,用于判断某位为0或为1等
按位进行逻辑与运算,不返回逻辑与结果
TEST reg,imm/reg/mem ;reg ^ imm/reg/mem
TEST mem,imm/reg ;mem ^ imm/reg
- TEST指令像AND指令一样来设置状态标志
- 常用于检测一些条件是否满足,一般后跟条件转移指令,目的是利用测试条件转向不同的分支
3.其他指令(能够影响状态标志的指令)
加减运算指令、逻辑运算指令、移位指令等
循环指令
循环条件判断可以使用条件转移指 ,同时 IA-32 处理器针对个数控制的循环设计有若干条指令, 要是 LOOP
指令和 JECX
指令。
一、LOOP指令
IA-32 处理器 的循环指令是 LOOP,使用 ECX 寄存器作为计数器(在实地址存储模型 使用 CX), 每执行 LOOP, ECX-1。然后判断 ECX 是否为 0: 如果不为 0, 表示循环没有结束,则转移到指定的标号处;如果为 0, 表示循环结束,则顺序执行下一条指令。
(1)LOOP指令格式
循环指 LOOP 的格式如下:
LOOP label
- 功能1:ECX←ECX-1(相当于
DEC ECX
) - 功能2:若ECX≠0,转移到LABEL, 否则,顺序执行(相当于
JNZ label
)
相当于
DEC ECX JNZ label
寄存器ECX是默认的计数器,目标地址采用相对短转移
(2)LOOP指令的应用
LOOP是循环指令,用于实现减量计数的循环控制
- 典型应用形式:
mov ecx,num ;设置循环的计数初值num
label: … ;循环体loop label ;ECX减1,未到0继续循环;到0循环结束,顺序执行
- LOOP指令的循环次数
循环初值 1 2 … 232−12^{32}-1232−1 0 循环次数 1 2 … 232−12^{32}-1232−1 2322^{32}232
LOOP指令先减1后判断
mov ecx,0 ;设置循环的计数初值 label: loop label ;ECX减1,未到0继续循环
二、JECXZ指令
LOOP 指令先进行 ECX 操作,然后判断 如果 ECX 等于0 时执行 LOOP 指令,则将循环2322^{32}232次。所以,如果数组元素的个数为 0, 本程序将出错,为此,我们可以使用另一条循环指令JECXZ (实地址存储模型是 JCXZ 指令)排除 ECX 等于0 的情况。
JECXZ指令格式:
JECXZ label
ECX=0,转移到label,否则,顺序执行
- 相当于:
CMP ECX,0 JZ label
- 相当于:
【汇编语言】转移指令循环指令相关推荐
- 汇编语言--转移指令
8086CPU的转移行为有以下几类. 只修改IP时,称为段内转移,比如:jmp ax. 同时修改CS和IP时,称为段间转移,比如:jmp 1000:0. 由于转移指令对IP的修改范围不同,段内转移又分 ...
- [从零学习汇编语言] - 转移指令原理详解
文章目录 前言 一.转移指令原理 1.1 计算机如何识别数据和指令 1.2 转移指令原理 1.3 转移分类 1.3.1 转移行为分类 1.3.2 转移指令分类 二.操作符详解 2.1 offset 2 ...
- 汇编语言--转移指令的原理
可以修改IP,或同时修改CS和IP的指令统称为转移指令.概括地讲,转移指令就是可以控制CPU执行内存中某处代码的指令. 8086CPU的转移行为有以下几类. 只修改IP时,称为段内转移,比如:jmp ...
- 汇编语言-008(条件跳转应用 、loopnz 条件循环指令使用 、loopz 条件循环指令使用 、 if语句编写汇编时 、while语句编写汇编时 、循环内的if语句嵌套)
1: 条件跳转应用,三个数中最小数 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data V1 WOR ...
- 6.汇编语言显示、指令
一:显示的原理 1.在屏幕中显示的内容来自显存中的数据 2.低位后8个高位前8个 3.在屏幕中显示 二:代码直接定址表 assume cs:code code segmenta : db 1,2,3, ...
- 汇编语言---字符串操作指令
汇编语言---字符串操作指令 字符串操作指令的实质是对一片连续的存储单元进行处理,这片连续的存储单元由隐含指针DS:SI或ES:DI来指定;字符串操作指令可对内存单元按照字节.字.双字进行处理,并能根 ...
- 镗孔指令g76格式_11种孔加工固定循环指令+1个案例=完美解决孔加工问题
钻孔循环指令:G81.G82.G73.G84.G74.G85.G86.G89.G76.G87.G80. 采用孔加工固定循环功能,只用一个指令,便可完成某种孔加工(如钻.攻.镗)的整个过程. 1孔加工循 ...
- vue指令-循环指令
列表渲染 创建 06-列表渲染.html v-for:列表循环指令 例1:简单的列表渲染 <!-- 1.简单的列表渲染 --> <ul><li v-for="n ...
- 华兴数控g71外圆循环编程_华兴数控的循环指令是怎么定义的。也就是G71。G72。那样的。...
展开全部 G71 G72 G73是复合循环指令. 格式:G71 U(△d) R(r) P(ns) Q(nf) E(e) F(f) S(s) T(t) 说明: G71 U (Δd) R(e) G71 P ...
最新文章
- 12层打败50层,ParNet 普林斯顿+英特尔:更深不一定更好
- jquery-validae
- linux 设置mysql 数据库编码utf8
- qt之旅-1纯手写Qt界面
- html5不支持的属性,HTML5 常用语法一览(列举不支持的属性)
- 计算机应用研究潜规则,基于相容矩阵计算的不完备决策系统规则获取算法
- 光储充一体化充电站_【储能项目】国家电网与浙江瓯江口新区共建光储充一体化充电站项目...
- JavaScript函数与对象
- cranly:你的R包管理工具
- AutoCAD2015 下载安装教程与使用技巧(已测有效)
- 内存碎片是什么?关于内存碎片的解释
- FlashFXP连接虚拟机ubuntu 16.04
- AVAudioPlayer实现音乐播放+歌词与播放进度同步
- 微信在线客服系统-微信公众平台开发
- Win11怎么以管理员身份运行?Win11以管理员身份运行的设置方法
- ews java 新建邮箱_通过EWS JAVA API订阅邮箱更新
- 法兰克服务器电源维修,FANUC电源模块故障维修
- 大小写英文字母对应的ASCII值
- Android GestureOverlayView详解
- 【视频课】行为识别课程更新!CNN+LSTM理论与实践!
热门文章
- Android课程设计--网上购物商城
- java eden s0 s1_JVM内存结构--新生代及新生代里的两个Survivor区(下一轮S0与S1交换角色,如此循环往复)、常见调优参数...
- 嵌入式软件开发就业面试题。2022最新,最全总结。
- KC网络电话完美破解版无限打电话使用说明
- ElasticSearch集群架构原理
- 数学中的图像重构 -- CT中的 Radon 变换 图解
- 精简70%、内存不到1G,可以装在显卡上的Win11来了
- 去长沙没有攻略? Python 爬取网红城市大长沙游玩攻略,送给第一次去长沙的你。
- 图书借阅管理系统规格说明书
- You may wish to exclude one of them to ensure predictable runtime behavior