当前位置:
文档之家› 第3章 80868088的指令系统(控制转移指令)
第3章 80868088的指令系统(控制转移指令)
指 令 JA / JNBE JAE / JNB JB / JNAE 转移条件 CF=0 且 ZF=0 CF=0 CF=1 含义 A>B AB A<B
JBE / JNA
CF = 1 或 ZF = 1
AB
表三
指 令 JG / JNLE JGE / JNL JL / JNGE
有符号数条件转移指令
转移条件 SF=OF 且 ZF=0 SF=OF SF OF 含 义 A>B AB A<B
N
CX=0? Y
例1:计算:1+2+3+...+20。结果 存入AX寄存器。
MOV CX,0014H MOV AX,0 A: ADD AX,CX LOOP A
初始化部分 处理部分 循环控制部分
• 例2 :设商店里有8种商品,它们的价格
分别为83元,76元,65元,84元,71元, 49元,62元,58元,现要将每种商品提 价7元,编程计算每种商品提价后的价格。
4、子程序调用和返回指令
CALL指令分两步执行 • 第一步是将返回地址,推出堆栈。 • 第二步是转到子程序的入口地址去执行 相应的子程序。 RET指令,从栈中弹出返回地址,使程序 返回主程序继续执行。
4、子程序调用和返回指令
名称 格式
执行的操作
段
直接近调用 CALL NEAR PTR DST
间接近调用 CALL WORD PTR DST CALL BX 直接远调用 CALL FAR PTR DST
• • • • • • • • •
0000 0002 0003 0005 0006
0405 90 EBFB 90
• 例 2 JMP DWORD PTR[SI+0125H] • CS=1200H,IP=05H,DS=2500H,SI=1300H • 内存单元 (26425H)=4500H • (26427H)=32F0H
CMP AL,60 JB FAIL CMP AL,85 JAE GOOD MOV DL,’P’ JMP PRINT FAIL: MOV DL,’F’ JMP PRINT GOOD:MOV DL,’G’ PRINT:….
3、循环指令
(1).循环程序结构
初始化部分 处理部分 循环控制部分
修改计数器及指针
名称
段 近返回 RET
格式
执行的操作
(IP)出栈
带参数近返回
内 段 远返回
RET expression (IP)出栈 (SP)←(SP)+16位位移量
RET (IP)出栈 (CS)出栈
带参数远返回
间
RET expression (IP)出栈 (CS)出栈 (SP)←(SP)+16位位移量
例 1 CALL PROG_N 调用前 CS=2000H,IP=1050H,SS=5000H SP=0100H,PROG_N与CALL指令之间的 字节距离等于1234H(即DISP=1234H) RET
标号 CX
;段内直接转移 ;段内间接转移
WORD PTR [BX]
FAR PTR 标号
;段内间接转移
;段间直接转移
DWORD PTR [BX][SI] ;段间间接转移
例1
列表文件
行号 1 2 3 4 5 6 7 8 偏移量 0000 机器码 程序 CODE SEGMENT ASSUME CS:CODE PROG_S:ADD AL,05H NOP JMP SHORT PROG_S NOP CODE ENDS END
机器码为FFAC2501H
2、条件转移指令
•
•
基本格式:
JXX
目标
说明: 字母“J”后面的“XX”是指“条件”,如果条件成立,
则转移至“目标”处执行,否则顺序执行。
条件转移指令共18条,它们均以F寄存器中状态标志
位作为判断条件,但执行后均不影响各标志位。
此类指令都只能在以当前IP内容为中心的 -128 至
指 令 JC JNC JE / JZ JNE / JNZ JS JNS
JO JNO JP / JPE JNP / JPO
OF=1 OF=0 PF=1 PF=0
有进/借位 无进/借位 相等/等于0 不相等/不等于0 是负数 是正数或0 有溢出 无溢出
有偶数个‘1’ 有奇数个‘1’
表二 无符号数条件转移指令
(IP)入栈 (IP)←(IP)+16位位移量
(IP)入栈 (IP)←(EA) (CS)入栈 (IP)入栈 (IP)←DST指定的偏移地址 (CS)←DST指定的段地址 (CS)入栈 (IP)入栈 (IP)←(EA) (CS)←(EA+2)
内 段
间
间接远调用 CALL DWORD PTR DST
4、子程序调用和返回指令
• 例2:设一个由17个字符组成的字符串存
放在STRING开始的内存中,查看该字符 串是否有空格符。若没有找到和尚未查 完,则继续,直到找到第一个空格符或 查完了才退出程序。(提示用LOOPNE 指令实现循环)
DATA SEGMENT STRING DB ‘Personal Computer’ DATA ENDS ……… MOV BX,OFFSET STRING DEC BX MOV CX,17 NEXT: INC BX CMP [BX],20H LOOPNE NEXT
例2 CALL FAR PTR PROG_F 设调用前: CS=1000H,IP=205AH,SS=2500H,SP= 0050H 标号PROG_F单元的地址指针 CS=3000H,IP=0500H 操作码9A00050030H
+127字节范围内转移(短转移)。超过要修改程序。
2、条件转移指令
• 这18条指令又可分为三大类:
简单条件转移指令
无符号数条件转移指令
带符号数条件转移指令
表一
标志位 CF ZF SF OF PF
简单条件转移指令
转移条件 CF=1 CF=0 ZF=1 ZF=0 SF=1 SF=0 含义
• •
本身,这样的程序段常用来实现延时。 例: MOV CX,100 DELAY:LOOP DELAY
LOOPE/LOOPZ指令工作流程
循环体 CXCX-1
Y
CX=0? N ZF=1? N
Y
LOOPNE/LOOPNZ指令工作流程
循环体 CXCX-1
Y
CX=0? N ZF=0? N
Y
举例
• 例1:设有一个由50个字节组成的数组存
LOOP
目标
指令功能:
自动进行循环次数的计数(即CXCX-1)后, 相当于这两条指令: 如计数寄存器CX≠0,则转移到目标单元,否则顺序 执行。 DEC CX JNZ/JNE 目标 说明:
此指令隐含使用CX作为循环计数器; 因此应注意先设置好CX的初始值。
LOOP指令工作流程
循环体 CXCX-1
循环结束? Y 结束处理部分 N
(2).为何需要循环?
• 简化程序的编程 • 简少程序对内存的占用。
(3).如何实现循环?
• 使用条件转移指令:Jxx • 使用循环控制指令:LOOP
目标 目标
等
8086/8088循环控制指令共有四条,下面介 绍其中一条最常用指令:
•
LOOP指令: 指令格式:
• JCXZ指令:
指令格式:
JCXZ 标号
指令功能: 若CX为0,则转移到指令中标号所指定的地 址处,否则将往下顺序执行,它不对CX进 行自动减一的操作
说明:这条指令主要用在循环指令开始处。 为了使程序跳过循环,只要先将CX清零。
4、子程序调用和返回指令
• •
在编写程序时,往往把某些能完成特定 功能而又经常用的的型。
CMPAXCX : CMP AX,CX JG EXIT MOV AX,CX EXIT:
JL NEXT
JMP EXIT NEXT:MOV AX,CX EXIT:
• 例2: 设某个学生的英语成绩已存放在AL寄
存器中,如果低于60分,那么打印F(FAIL); 若高于或等于85分,则打印G(GOOD);当在 60分和84分之间时,打印P(PASS)。
放在ARRAY开始的内存单元中,现对该 数组中的元素进行测试,若元素为0,而 且不是最后一个元素,则继续进行下一 个元素的测试,直到找到第一个非零元 素或查完为止。(提示:用LOOPE指令 实现循环)
DATA SEGMENT ARRAY DB 50 DUP(?) DATA EDNS …… MOV BX,OFFSET ARRAY DEC BX MOV CX,50 NEXT : INC BX CMP [BX],00h LOOPE NEXT …… ……
OLD DB 83H,76H,65H,84H,71H,49H,62H,58H NEW DB 8 DUP(?) MOV CX,8 MOV BX,0 NEXT:MOV AL,OLD[BX] ADD AL,7 DAA MOV NEW[BX],AL INC BX LOOP NEXT
• 循环体内也可以只有一条指令,即LOOP
控制转移指令
• 无条件转移指令 • 条件转移指令 • 循环指令 • 子程序调用和返回指令 • 中断调用和返回指令
• •
1、无条件转移指令
格式:
JMP 目标
说明: 目标通常用标号来表达,根据转移的远 / 近、直接 / 间
接不同,可有以下几种格式:
• JMP • JMP • JMP • JMP • JMP
JLE / JNG
SF OF 或
ZF = 1
AB
• 例1:已知三个带符号数存放在AX、BX、
CMP AX,BX CMP AX,BX JG CMPAXCX
CX寄存器中,编程求这三个数的最大值, 并存放在AX寄存器中。