80868088的指令与汇编语言.

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
指令格式 转移条件 含义 测试状态位个数
JL/JNGE标号
SF≠OF
A<B
2
JLE/JNG标号
SF≠OF OR ZF=1
A<=B
3
JG/JNLE标号
SF=OF AND ZF=0
A>B
3
JGE/JNL标号
SF=OF
A>=B
2
第4章 8086/8088的指令与汇编语言
4.1 汇编语言的概念 4.2 指令格式及寻址方式 4.3 常用指令 4.4 汇编程序的结构 4.5 逻辑指令与移位指令 4.6 常用控制转移类指令 4.7 分支程序的设计方法 4.8 循环程序的设计方法 4.9 综合应用举例 4.10 其他指令介绍
CMP是一条专为条件转移指令设置的指令,通常会在 它的后面跟一条比较转移指令。 2.比较转移指令 虽然对两个数进行比较时有6种可能情况,但 8086/8088系统根据被比较的两个数是无符号数,还是有 符号数分别设置了比较转移指令。由于在实际工程应用中 ,几乎全是无符号数的比较,我们只介绍无符号数的比较 转移指令。 比较转移指令的格式及操作: JA OPR ; 大于(>),则转移到OPR所指的位置 JB OPR ; 小于(<),则转移到OPR所指的位置 JE OPR ; 等于(=),则转移到OPR所指的位置 JAE OPR ; 大于等于(≥),则转移到OPR所指的位置 JBE OPR ; 小于等于(≤),则转移到OPR所指的位置 JNE OPR ; 不等于(≠),则转移到OPR所指的位置
AL,VAL AL,VBL SVA2 AL,VBL SVA1 VCL,0 DONE VCL,1 DONE VCL,2
第4章 8086/8088的指令与汇编语言
4.6.4判断转移指令列表
表4-1 单个标志位判断转移指令
测试位 CF JNC OPR JP/JPE OPR PF JNP/JPO OPR JZ/JE OPR ZF JNZ/JNE OPR JS OPR SF JNS OPR JO OPR OF JNO OPR OF=0 无溢出
第4章 8086/8088的指令与汇编语言
4.7.1 分支程序的一般结构
现代程序设计中,分支程序是必不可少的结构之一, 也是学习程序设计过程中的一个难点。分支程序具有设计 灵活、形式多变的特点,但归纳起来其结构不外以下几 种。 1.单路简单分支 单路简单分支的结构如图4-10所示。执行过程为:当 条件成立时跳过一些指令,否则继续按源程序原来的排列 顺序执行。 在汇编语言的编程过程中,我们尽可能地做到先画流 程图,然后再编写程序。 画分支结构的流程图时要特别注意,尽量使判断框的 成立分支(Y)处于水平状态,而不成立分支(N)处于垂 直状态,这种结构与汇编语言的控制转移转移指令地执行 机制正好相同,按照这样的画法在编写程序时可以相对地 容易一些:我们只需按照流程图的顺序逐次地写出相应的 指令即可。
第4章 8086/8088的指令与汇编语言
4.6.3多标志位判断转移指令
多标志位判断转移指令实际上将两个操作数进行比 较,根据比较的情况决定是否转移,因此,多标志位判断 转移指令又叫比较转移指令。从数学上讲,两个数相比较 有六种情况(>、≥、<、≤、=、≠),8086/8088为 这六种情况分别设计了指令。 由于8086/8088的转移条件并不在指令中出现,为此 比较转移指令必须与专门的比较指令配套使用。
第4章 8086/8088的指令与汇编语言
Main: MOV MOV LEA LEA MOV Next: MOV MOV INC INC INC CMP JC
第4章 8086/8088的指令与汇编语言
第4章 8086/8088的指令与汇编语言
4.1 汇编语言的概念 4.2 指令格式及寻址方式 4.3 常用指令 4.4 汇编程序的结构 4.5 逻辑指令与移位指令 4.6 常用控制转移类指令 4.7 分支程序的设计方法 4.8 循环程序的设计方法 4.9 综合应用举例 4.10 其他指令介绍
第4章 8086/8088的指令与汇编语言
4.6.1 无条件转移指令(JMP)
顺序结构的程序,CPU执行时从第一条指令开始,顺 序向后执行,直到最后一条。然而在许多实际应用中往往 需要根据某种条件改变原来的程序执行顺序,控制转移指 令就是用来改变程序执行顺序的。控制转移指令分条件转 移指令和无条件转移指令。无条件转移指令的使用方法为 : 格式:JMP OPR 操作:使程序无条件地从当前位置转移到由OPR指定的位 置去执行,并且执行完后不再返回到当前位置。 OPR与JMP本身的距离做了限制,一般为不超过-128~ +127字节(不是指令)。
第4章 8086/8088的指令与汇编语言
ADD Buff,07H Done: ……
图4-13 数据转换流程图
第4章 8086/8088的指令与汇编语言
3.数据传送实例
例4-37:变量(数据块)X中有10个字符 (’ABCD1234’),变量(数据块)Y中有8个字符 (’12345678’),编程:用X的值覆盖Y。 分析:在实际工程应用中,将一批数据从一个位置移动到 另一个位置是一种经常遇到的操作,对这类问题通常是采 用逐个传送的办法来实现的:先从源中读出一个数据,然 后将它传送到目的,接着再从源读下一个数,……,依次 操作,直到完成全部数据。 对这类问题的理想解决方案是:先用LEA指令将数据 块的首地址送入一个变址或基址寄存器,然后通过间接寻 址方式访问操作数,通过寄存器加1操作调整存储器的地 址。本例的程序流程如图4-14所示,完整的程序代码为: X DB ’ABCD1234’ Y DB ’12345678’
第4章 8086/8088的指令与汇编语言
指令格式 JC OPR
转移条件 CF=1 CF=0 PF=1 PF=0 ZF=1 ZF=0 SF=1 SF=0 OF=1
含义 有进位/借位 无进位/借位 有偶数个 “1” 有奇数个 “1” 相等/等于0 不相等/不等于 是负数 是正数 有溢出
表4-2
指令格式
图4-11 双路简单分支结构
第4章 8086/8088的指令与汇编语言
3.多分支 多分支的结构形式更加多样化,图4-12是一种典型的 结构示意图。只要能够基本掌握简单分支程序的编写,多 分支程序也应该能够编写的。
图4-12多分支结构
第4章 8086/8088的指令与汇编语言
4.7.2 典型分支程序的实现方法
第4章 8086/8088的指令与汇编语言
4.6.2单一标志位判断转移指令
8086/8088系统是根据标志位的不同状态分别设计了 对应的条件转移指令。 根据转移条件的不同,可分为单一标志位判断转移指 令和多标志位判断转移指令。 常用的单一标志位判断转移指令有两种,进位标志CF 判断转移指令JC和零标志ZF判断转移JZ,它们使用方法 为: 格式:JC OPR JZ OPR 操作:对于JC指令,如果进位标志(CF)=1,则下一条指 令就转到OPR所指的位置;否则,就继续执行紧接“JC OPR”后的下一条指令。对于JZ指令,如果零标志(ZF) =1,则下一条指令就转到OPR所指的位置;否则,就继续 执行紧接“JC OPR”后的下一条指令。
第4章 8086/8088的指令与汇编语言
图4-10 单路简单分支结构
2.双路简单分支 双路简单分支的结构如图4-11(a)所示,执行过程 为:当条件成立执行一段指令,而条件不成立时执行另一 段程序。
第4章 8086/8088的指令与汇编语言
如果我们将流程图转换为图 4-11 ( b )的形式,显然 他们是等效的,这时若按这样的顺序写指令:“条 件”→“程序段A”→“JMP”→“程序段B”,也就是在 程序段 A的结束处加一条 JMP指令,并令其转到程序段 B 之 后的第一条指令(实际上是它们共同的下一条指令),则 又变成照流程图的顺序逐次地写指令了。
1.偏移地址传送指令 格式:LEA REG,SRC 操作:(REG)←SRC,即把源操作数(SRC应是存储器操 作 数)的偏移地址送到指定的寄存器中(REG)。 在这条指令里REG必须是一个16位寄存器,SRC可以是 除立即数和寄存器以外的所有寻址方式,但这条指令并不 是取操作数的指令,而是取到操作数的地址。也就是说: 即执行本指令后,REG中得到的不是SRC的数值,而是数值 的位置(地址)。 若(SI)=2000H,则执行“LEA BX,[SI+100H]”指 令后,(BX)=2100H,而不是像MOV指令那样到偏移地址( 2100H)取一个数。在实际编程中,这种形式极少用到, 一般是在SRC处是变量名(直接地址,即变量)。
第4章 8086/8088的指令与汇编语言
例4-33:假定VAL、VBL、VCL 均为已定义的字节型变量,编程 实现:若VAL≥VBL,VCL=1, 否则VCL=0。
MOV BL, 0 MOV AL, VAL SUB AL, VBL JC SAV MOV BL, 1 SAV:MOV VCL,BL
JC OPR和JZ OPR分别有一条与它转移条件正好相反的指令: JNC OPR ; 当进位标志位不为零时,转移 JNZ OPR ; 当进位结果不为零时,转移
1.比较指令
格式:CMP OPR1,OPR2 操作:(OPR1)-(OPR2),该指令用OPER1减去OPER2 后,并不保存结果,仅是根据结果改变标志位的状态。 CMP指令与SUB 指令在寻址方式、对标志位的影响方 面完全相同,不同之处在于它虽然对两个操作数做了减 法,但并没有改变它们的值。
第4章 8086/8088的指令与汇编语言
第4章 8086/8088的指令与汇编语言
例4-35:假定VAL、VBL、VCL均为已定义的字节型变量,编 程实现:若VAL>VBL,则VCL=2;若VAL<VBL,则VCL=1;若 VAL=VBL,则VCL=0。
第4章 8086/8088的指令与汇编语言
MOV CMP JA CMP JB MOV JMP SVA1: MOV JMP SVA2: MOV DONE: ……
无符号数比较转移指令
转移指令 含义 测试状态位个数
JC/JB/JNAE标号
CF=1
A<B1 OR ZF=1
A<=B
2
JA/JNBE标号
CF=0 AND ZF=0
A>B
2
JNC/JAE/JNB标号
CF=0
A.>=B
1
第4章 8086/8088的指令与汇编语言
表4-3 有符号数比较转移指令
第4章 8086/8088的指令与汇编语言
汇编语言中,LEA指令常用于数据块操作中, 通常是在操作前,先用它将数据块的首地址取到 基址或变址寄存器中,然后再通过寄存器以间接 寻址的方式访问操作数,这样做可以使后面程序 的规整形更好些。 2.数据转换实例 在控制系统中,计算机内部的数据与外部需 要的数据在格式上经常是不同的,例如:经计算 机处理后某控制对象的状态值是“25”,那么它 在计算机内部的表示形式是 “00011001”(十六 进制19H),如果要将它输出到普通的显示器上, 就必须将它转换为两位ASCII码,这样就成了32H 和35H两个数了。在设计输入输出系统时必须对数 据先进行转换处理。
第4章 8086/8088的指令与汇编语言
例4-36:变量Buff中存放着一个从控制对象采集来的数据, 其值在0~15之间。编程:将Buff中的数据转换为一位 ASCII码,以备输出之用。 分析:0~15正好对应一位十六进制数(0H~9H、0AH~ 0FH),数字0~9的ASCII码是30H~99H,A~F(10~15) 的ASCII码是41H~46H,这样在编程时就要根据原始数据 的不同,采用不同的方法。 具体算法为:如果原始数据是0~9,则加30H;如果 是10~15,则加37H。这样看来这似乎是一个双路简单分 支算法,如图4-13(a),其实我们完全可以将它设计成 单路简单分支结构,我们可以先给Buff加30H,然后判断 它与39H比较,如果小于等于,则说明原数在0~9之间, 转换结束;如果不是,则说明原数在10~15之间,应补加 07H,然后转换结束。程序的流程如图4-13(b)所示,核 心代码为: Aga:ADD Buff,30H CMP Buff,39H JBE Done
相关文档
最新文档