汇编--学习笔记(十)-分支程序
来源:互联网 发布:江苏运时数据招聘 编辑:程序博客网 时间:2024/05/20 05:54
分支程序无论是在高级语言中还是在汇编语言中都是应用最广泛的,也是最基本的程序结构。在汇编语言里进行分支程序设计中,测试某些条件时经常用到的是比较指令(CMP)、条件转移指令和无条件转移指令(JMP)。
一、标号
1、概念:标号用来说明可执行指令在汇编语言中的位置。另外,在汇编语言中,过程名亦可以视为标号。
2、作用:标号可以作为转移指令(或调用指令CALL)的操作数。
3、属性:和变量类似,标号有三种属性:
- 段:(SEGMENT)在哪个段定义标号;
- 位移量:(OFFSET)在什么位置上定义的标号; 标号只要有了定义,前两个属性就自然产生。
- 距离:(DISTANCE)分为NEAR(近)和FAR(远) 2种。标号的距离属性需要在定义标号时指出。
4、NEAR
如果以标号只能在本段中(即标号所定义的段中)用JMP或条件转移指令(或CALL)进行访问,那么必须将这个标号的距离属性定义为NEAR。
5、FAR
如果一个标号能为其它段中的JMP(或CALL)的指令来访问,那么必须将这个标号属性定义为FAR。
NEAR标号的定义
1、隐含说明:距离属性为NEAR的标号可以用隐含的说明,即:在标号后面加上冒号,放在指令前面
例如:
L1: MOV AX,BXLOOP: ADD AX,100@: SUB AX,BX
L1、LOOP和@都是标号名(标识符),标号L1、LOOP和@的距离属性均为NEAR。
FAR标号的定义
距离属性为FAR的标号没有隐式的说明,只能用显式说明,即只能用LABEL伪指令明显地说明,或在EQU伪指令中用THIS操作符明显地指明。
1、用LABEL
例如:
L4 LABEL FAR MOV AX,DX
2、在EQU伪指令中用THIS操作符明显地指明
例如:
L5 EQU THIS FAR OR AL,30H
标号L4和L5的距离属性均为FAR。
标号操作符
1、SEG –取段地址
- 格式:
SEG 标号名
- 功能:返回标号所在段的基址
- 举例:
MOV AX,SEG L2 ;将标号L2所在段的基址送至AX
2、OFFSET –取位移量
- 格式:
OFFSET 标号名
- 功能:返回标号所在段的位移量
- 举例:
MOV BX,OFFSET L2 ;将标号L2所在段的位移量送至BX
3、TYPE –取距离属性
- 格式:
TYPE 标号名
- 功能:返回的是标号的距离属性NEAR或FAR。
二、无条件转移指令
1、指令的执行顺序:指令的执行顺序有代码段寄存器(CS)和指令指针寄存器(IP)的内容决定。
2、CS:CS寄存器中存放有当前代码段的基地址。当前代码段就是正在从中取出指令(代码)的存储器部分,其容量可达64K字节。
3、IP:IP中内容为要执行的下一条指令距当前代码段基地址的位移量(偏移地址)。
4、下一条指令地址:CS和IP结合((CS)*16+(IP)),指向将从中取出下一条指令的存储单元。
5、指令执行的过程:在大多数工作状态下,要执行的下一条指令已从存储器中取出,并放在CPU的指令队列中等待执行。
6、转移指令的作用:转移指令对指令指针寄存器IP或代码段寄存器CS起作用改变这些寄存器的内容一般就会改变正常的执行顺序。当程序发生转移时,指令队列中就不再有接下来要执行的指令。总线接口单元将利用新的IP和CS值从存储器中取得下一条指令,直接把该指令传送给执行单元;然后开始从新的指令存储单元中取指令,重新补充指令队列。
7、转移指令分类,分4组:
- (1)无条件转移指令
- (2)条件转移指令
- (3)迭代(循环)控制指令
- (4)中断指令
这些指令中,只有中断指令会影响CPU的标志,其他的都不会影响状态标志,而很多转移指令的执行过程都会受标志状态的影响。
一、JMP—无条件转移指令(C语言goto)
1、格式:JMP 目的操作数
2、功能:无条件地控制转移至目标单元(目的操作数)。
3、说明:
- (1)JMP指令只有一个操作数,用来指定程序应当在哪里继续下去(这个值也称为转移目标)。在JMP指令里,定义操作数的各种寻址方式比通常的指令还复杂。
- (2)JMP指令可以进行段内转移。也可以进行段间转移,即从一个代码段转移到另一个代码段的某一个位置继续运行。
- (3)JMP指令有直接和间接两个基本类型的寻址方式。
二、JMP指令的具体格式
1、段内(或组内)直接转移
(1)格式:JMP 标号名 ;标号为NEAR属性
(2)说明:
- 1)目的操作数是一个标号,这个标号时在本段内(或本组内)某一个指令的前面,后面缀以冒号来定义器位置的(位移量)。
- 2)汇编程序计算出JMP指令的下一条指令和转移目标的地址(标号的位移量)之间的相对位移量。因为JMP指令可以向前转移也可以向后转移,所以这个相对位移量有正有负,故总是解释为有符号的二进制补码数(带符号二进制数)。
- 3)汇编程序将这个相对位移量加到指令指针寄存器IP中去,从而改变IP的内容,实现程序的转移。
(3)举例:
JMP L1 ;向前转移到L1(相对位移量为正)......L2: AND DL,0FH ;L2在此定义L1: MOV AL,100 ;L1在此定义 JMP L2 ;向后转移到L2(相对位移量为负)
其中相对位移量的范围在-32K~+32K。如果相对位移量为一个字节所能表示的范围-128~+127,那么可以用短(SHORT)转移
2、段内直接短转移
3、段内间接转移
4、段间直接转移
(1)格式:JMP 标号 ;标号为FAR属性
(2)说明:
在这个格式下,汇编程序生成2个字的操作数(双字指示器)。JMP指令执行的操作是用第一个字,即目标标号在其所在的段中的位移量去替换IP的内容,用第二个字,即目标标号所在的代码段的段基址代替源CS的内容,以实现其转移。例如:
CODE1 SEGMENT JMP FARL ;FARL标号在CODE2段的位移量=>IP,CODE2段基址=>CS ......CODE1 ENDSCODE2 SEGMENT FARL LABEL FAR......CODE2 ENDS
5、段间间接转移
三、条件转移指令
一、CMP指令(比较指令)
1、格式:CMP 目的操作数,源操作数
2、功能:
CMP
四、分支程序举例
- 汇编--学习笔记(十)-分支程序
- 汇编笔记--顺序,分支
- C语言程序学习(十)笔记
- 汇编--学习笔记(十三)-中断及中断处理程序
- 汇编学习---分支结构程序设计
- 汇编学习-分支与循环
- 8086汇编学习笔记3-程序组织
- 汇编学习笔记--包含多个段的程序
- 汇编学习(十)8086汇编拾遗 (9)
- 如何用汇编编写程序——汇编学习笔记(五)
- 汇编入门学习笔记 (十)—— 标志寄存器、串传送指令
- 学习笔记(十)
- 汇编学习笔记(1)
- 汇编学习笔记(2)
- 汇编学习笔记(3)
- 汇编学习笔记(5)
- 汇编学习笔记(6)
- 汇编学习笔记(一)
- [UOJ 300][CTSC2017]吉夫特-扩展Lucas定理
- 订单系统框架整合,及代码
- java游戏服务器之网络层Netty 之ChannelPipeline
- Go语言学习之语言特性
- linux-shell常见快捷键
- 汇编--学习笔记(十)-分支程序
- 写多线程去压测秒杀接口
- 淘淘商城系列——服务调用测试
- 初识Spring-MVC之最小配置运行Hello world的maven项目
- HTML元素类型
- 组合框ComBoBox
- DecorView如何添加到Window
- mysql存储过程
- BSS段、数据段、代码段、堆与栈