第03章 8086的指令系统D
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.4.5 控制转移指令
控制转移指令用来改变程序的执行顺序, 控制转移指令用来改变程序的执行顺序 , 执行转移就是将 目的地址传送给代码段寄存器CS 与指令指针寄存器IP CS与指令指针寄存器 IP. 目的地址传送给代码段寄存器 CS 与指令指针寄存器 IP. 如 果跳转目的地与被转移点在同一代码段, 果跳转目的地与被转移点在同一代码段 , 称为 " 段内转 此时, 只需指明目标地址的有效地址( 16位 移 " , 此时 , 只需指明目标地址的有效地址 ( 16 位 ) . 如果 跳转目的地与被转移点不在同一代码段, 跳转目的地与被转移点不在同一代码段 , 称为 " 段间转 此时,需知道目标地址的段地址( 16位 移 " , 此时 , 需知道目标地址的段地址 ( 16 位 ) 及有效地址 16位 (16位). 控制转移指令的寻址方式分为" 直接寻址" 控制转移指令的寻址方式分为 " 直接寻址 " , " 间接 寻址" 两种. 如果指令中直接给出目标地址, 寻址 " 两种 . 如果指令中直接给出目标地址 , 如地址标号 或立即数( 偏移量, 目标与源之间的偏移距离) , 称为" 直 或立即数( 偏移量 , 目标与源之间的偏移距离 ) 称为" 接寻址" 如果指令中, 给出目标地址存放地的地址, 接寻址 " ; 如果指令中 , 给出目标地址存放地的地址 , 如 寄存器或内存地址,称为"间接寻址". 寄存器或内存地址,称为"间接寻址" 控制转移指令包括:转移指令,循环控制指令, 控制转移指令包括:转移指令,循环控制指令,过程 调用指令和中断指令等4 调用指令和中断指令等4类.
①段内 调用, 调用, CS不变 CS不变 ②FAR PTR表 PTR表 示段间 调用 ③ DWORD PTR表 PTR表 明内存 操作数 属性为 双字, 双字, 用于段 间调用
直接 段间 调用 间接
2 循环控制指令
循环指程序段在一定条件下重复执行. 循环指程序段在一定条件下重复执行. 循环指令提供了程序段循环的控制及手段. 循环指令提供了程序段循环的控制及手段 . 这些指令都用 CX寄存器作为循环次数计算器 寄存器作为循环次数计算器, 这些指令都 用 CX 寄存器作为循环次数计算器 , 表示某程序段最大循环次数, 且循环体每执 表示某程序段最大循环次数 , 行一次,CX被减去 被减去1 行一次,CX被减去1. 8086/ 8088CPU 规定被循环的程序段必须在同 CPU规定 8086 / 8088 CPU 规定 被循环的程序段必须在同 一段内,且长度不能大于256字节. 256字节 一段内,且长度不能大于256字节. 循环控制指令有3 循环指令LOOP LOOP, 循环控制指令有3条:循环指令LOOP,相等循 LOOPE/LOOPZ, 环 指 令 LOOPE/LOOPZ, 不 相 等 循 环 指 令 LOOPNE/LOOPNZ. LOOPNE/LOOPNZ.
1 转移指令
转移指令将正在被执行的指令集的执行点从一处转 转移指令将正在被执行的指令集的执行点从一处转 到另一处. 到另一处. 源地址与目标地址的距离称为跳转 偏移量" 跳转" 源地址与目标地址的距离称为跳转"偏移量",偏 移量是符号数. 移量是符号数.
当用一个字节表示偏移量时 当用一个 字节表示偏移量时 , 即源地址与目标地址之距 字节 表示偏移量时, 127~ 128之间 称为" 之间, short)转移 转移" 在+127~-128之间,称为"短(short)转移"; 当用一个字表示偏移量时, 当用一个 字 表示偏移量时 , 即源地址与目标地址之距在 32767~ 32768之间 称为" 之间, near)转移 转移" +32767~-32768之间,称为"近(near)转移".
3 过程调用和返回指令
如果有一些程序需要在不同的地方多次出现, 如果有一些程序需要在不同的地方多次出现 , 则可 以将这些程序段设计成过程(即子程序) 以将这些程序段设计成过程 (即子程序) ,供需要时 调用. 调用. 在过程(即子程序)中要安排返回指令, 在过程 ( 即子程序 )中要安排返回指令 ,使得过程结 束时,返回到调用处. 束时,返回到调用处. 如: 显示一个字符,需要利用下列程序段完成: 显示一个字符,需要利用下列程序段完成:
续表
特征 助记符 JA / JNBE JBE / JNA 转移条件 CF∨ZF=0 CF∨ZF=0 CF∨ZF=1 CF∨ZF=1 SF⊕OF=0 SF⊕OF=0 SF⊕OF=1 SF⊕OF=1 ( SF⊕OF)∨ZF =0 ( SF⊕OF)∨ZF =1 CX=0 CX=0 符号数 说明 大于 或 不小于等于 转移 小于等于 或 不大于 转移 大于等于 或 不小于 转移 小于 或 不大于等于 转移 大于 或 不小于等于 转移 小于等于 或 不大于 转移
调用 类型
寻址 方式
格 式
操 作
示 例
说 明
procCALL proc-name 直接 disp16 CALL disp16 段内 调用 CALL BX 间接 CALL r16 / m16 ①IP入栈; IP入栈; 入栈 (r16)/(m16 16)/(m16) ②IP← (r16)/(m16) CALL WORD PTR [BX] ①IP入栈; IP入栈; 入栈 ②IP ← IP + 偏移量 SUB1 CALL SUB1
mov dl,'a' mov ah,2 int 21h
DL寄存器保存 DL寄存器保存 要显示的Leabharlann Baidu符 ASCII码 的ASCII码
过程与调用程序在同一段内, 过程与调用程序在同一段内,称"段内调用"; 段内调用" 过程与调用程序不在同一段内, 过程与调用程序不在同一段内,称"段间调用". 段间调用" 过程调用指令为:CALL 过程调用指令为: 返回指令为: 返回指令为:RET 过程调用与返回指令均不影响标志位,但影响堆栈. 过程调用与返回指令均不影响标志位,但影响堆栈. 不影响标志位
无符号 数
多 标 志 位
JGE / JNL JL / JNGE JG / JNLE JLE / JNG
CX
JCXZ
【例】比较两个字属性的符号数X,Y的大小,如果X>Y, 比较两个字属性的符号数X 的大小,如果X>Y, X>Y AL为 如果X=Y AL为 X=Y, 如果X<Y AL为 FFH. X<Y, AL为1,如果X=Y,AL为0,如果X<Y,AL为0FFH. 为内存变量,功能实现主要代码如下: 解:设X,Y为内存变量,功能实现主要代码如下: AX, MOV AX,X AX, CMP AX,Y JLE LE MOV AL,1 AL, ;X > Y,AL=1 AL=1 JMP DONE LE: LE:JL L AL,00H AL=00 00H MOV AL,00H ;X = Y,AL=00H JMP DOWN AL, AL=0 L:MOV AL,0FFH ;X < Y,AL=0FFH DONE: DONE:HLT
名称
格式
操作 ① CX ← CX – 1 ② 如 果 CX = 0, 结 束 循 执行后续语句. 环 , 执行后续语句 . 否则 转移到标号处. 转移到标号处. ① CX ← CX – 1 如果CX ② 如果 CX = 0 或 ZF= 0, 结束循环, 结束循环 , 执行后续语句 否则转移到标号处. .否则转移到标号处. ① CX ← CX – 1 如果CX ZF=1 ② 如果 CX =0 或 ZF=1, 结 束循环, 执行后续语句. 束循环 , 执行后续语句 . 否则转移到标号处. 否则转移到标号处.
转移指令又可分为两类: 转移指令又可分为两类:
无条件转移指令 条件转移指令
无条件转移指令JMP 无条件转移指令
格式:JMP dest 格式: 说明: 说明:
dest可以是标号,立即数,寄存器,内存操作 可以是标号,立即数,寄存器, 可以是标号 数.
类 型
寻址 方式 直接
操作数 地址符号
目标地址计算 IP ← IP + 偏移量 CS不变 CS不变 IP ← 寄 存器 IP ←( 存 储器) 储器) JMP NEXT
间接 存储器 地址符号
CS不 CS不 变
段 间 转 移
直接 立即数(32位 立即数 ( 32 位 ) 间接 内存(双字) 内存(双字)
IP ← 目标偏移地址 立即数低16 16位 /立即数低16位 CS ← 目 标 段 地 址 / 立即数高16 16位 立即数高16位 (EA+1 IP ← (EA+1,EA) (EA+3 EA+2 CS ← (EA+3,EA+2)
说明
大于等于 或 不小于 转移
小于 或 不大于等于
有进位或借位 转移 无进位/ 无进位/借位 转移 等于转移 不等于 转移 无溢出 转移 有溢出 转移 1的个数为奇数 转移 1的个数为偶数 转移 正数 转移 负数 转移
单 标 志 位
JZ JNZ JNO JO JNP / JPO JP / JPE JNS JS
循环 指令
LOOP
ShortShort-label
相等循 环指令
ShortLOOPZ/LOOPE Shortlabel
不相等 循环指 令
ShortLOOPNZ/LOONE Shortlabel
【例】有一首地址为Array的长度为M字数组,试编写实现下列功能 有一首地址为Array的长度为M字数组, Array的长度为 的代码:统计出数组中0元素的个数,并存入变量total total中 的代码:统计出数组中0元素的个数,并存入变量total中. CX, 数组长度存入循环计数器CX MOV CX,M ;数组长度存入循环计数器CX total, 计数变量初始值为0 MOV total,0 ;计数变量初始值为0 SI, 初始偏移量送寄存器SI MOV SI,0 ;初始偏移量送寄存器SI AGAIN:MOV AX,Array[SI] AX, ;取数 AX, CMP AX,0 ;与0比较 不为0 JNZ NEXT ;不为0,取下一个数 计数器加1 INC total ;为0,计数器加1 SI, 调整地址, NEXT:ADD SI,2 ;调整地址,指向下个数 LOOP AGAIN ;进入下一轮循环 显然, AGAIN指令的功能与下列语句相同 指令的功能与下列语句相同: 显然,LOOP AGAIN指令的功能与下列语句相同: DEC CX JNZ AGAIN 但是,LOOP指令中完成的操作CX←CX指令中完成的操作CX←CX 不影响标志位. 但是,LOOP指令中完成的操作CX←CX-1,不影响标志位.
示例 SHORT
说明
段 内 转 移
立即数( 立即数 ( 偏移 量) 寄存器
2100H JMP 2100H JMP BX JMP [BX] JMP FAR PTR NEXT JMP 21000100H 21000100H JMP DWORD PTR [BX]
①SHORT 表示短跳; 表示短跳; ②FAR表 FAR表 示段间跳 ; ③DWORD PTR表明 PTR表明 内存操作 数属性为 双字
过程调用的寻址方式
直接寻址
调用指令中直接给出被调用过程的首地址( 调用指令中直接给出被调用过程的首地址(标号或 立即数). 立即数)
间接寻址
预先把被调用过程的地址存于寄存器或内存, 预先把被调用过程的地址存于寄存器或内存,调用 指令仅给出这些地址存放处(寄存器名或内存地址), 指令仅给出这些地址存放处(寄存器名或内存地址) 间接寻址" 为"间接寻址".
(2) 条件转移指令
格式:Jcc short-label 格式: short说明: 说明: cc代表跳转条件 该指令只能实现段内短转移. 代表跳转条件, cc代表跳转条件,该指令只能实现段内短转移.
特征
助记符 JAE / JNB JB /JNAE JC JNC
转移条件 CF=0 CF=0 CF=1 CF=1 CF=1 CF=1 CF=0 CF=0 ZF=1 ZF=1 ZF=0 ZF=0 OF=0 OF=0 OF=1 OF=1 PF=0 PF=0 PF=1 PF=1 SF=0 SF=0 SF=1 SF=1 无符 号数
控制转移指令用来改变程序的执行顺序, 控制转移指令用来改变程序的执行顺序 , 执行转移就是将 目的地址传送给代码段寄存器CS 与指令指针寄存器IP CS与指令指针寄存器 IP. 目的地址传送给代码段寄存器 CS 与指令指针寄存器 IP. 如 果跳转目的地与被转移点在同一代码段, 果跳转目的地与被转移点在同一代码段 , 称为 " 段内转 此时, 只需指明目标地址的有效地址( 16位 移 " , 此时 , 只需指明目标地址的有效地址 ( 16 位 ) . 如果 跳转目的地与被转移点不在同一代码段, 跳转目的地与被转移点不在同一代码段 , 称为 " 段间转 此时,需知道目标地址的段地址( 16位 移 " , 此时 , 需知道目标地址的段地址 ( 16 位 ) 及有效地址 16位 (16位). 控制转移指令的寻址方式分为" 直接寻址" 控制转移指令的寻址方式分为 " 直接寻址 " , " 间接 寻址" 两种. 如果指令中直接给出目标地址, 寻址 " 两种 . 如果指令中直接给出目标地址 , 如地址标号 或立即数( 偏移量, 目标与源之间的偏移距离) , 称为" 直 或立即数( 偏移量 , 目标与源之间的偏移距离 ) 称为" 接寻址" 如果指令中, 给出目标地址存放地的地址, 接寻址 " ; 如果指令中 , 给出目标地址存放地的地址 , 如 寄存器或内存地址,称为"间接寻址". 寄存器或内存地址,称为"间接寻址" 控制转移指令包括:转移指令,循环控制指令, 控制转移指令包括:转移指令,循环控制指令,过程 调用指令和中断指令等4 调用指令和中断指令等4类.
①段内 调用, 调用, CS不变 CS不变 ②FAR PTR表 PTR表 示段间 调用 ③ DWORD PTR表 PTR表 明内存 操作数 属性为 双字, 双字, 用于段 间调用
直接 段间 调用 间接
2 循环控制指令
循环指程序段在一定条件下重复执行. 循环指程序段在一定条件下重复执行. 循环指令提供了程序段循环的控制及手段. 循环指令提供了程序段循环的控制及手段 . 这些指令都用 CX寄存器作为循环次数计算器 寄存器作为循环次数计算器, 这些指令都 用 CX 寄存器作为循环次数计算器 , 表示某程序段最大循环次数, 且循环体每执 表示某程序段最大循环次数 , 行一次,CX被减去 被减去1 行一次,CX被减去1. 8086/ 8088CPU 规定被循环的程序段必须在同 CPU规定 8086 / 8088 CPU 规定 被循环的程序段必须在同 一段内,且长度不能大于256字节. 256字节 一段内,且长度不能大于256字节. 循环控制指令有3 循环指令LOOP LOOP, 循环控制指令有3条:循环指令LOOP,相等循 LOOPE/LOOPZ, 环 指 令 LOOPE/LOOPZ, 不 相 等 循 环 指 令 LOOPNE/LOOPNZ. LOOPNE/LOOPNZ.
1 转移指令
转移指令将正在被执行的指令集的执行点从一处转 转移指令将正在被执行的指令集的执行点从一处转 到另一处. 到另一处. 源地址与目标地址的距离称为跳转 偏移量" 跳转" 源地址与目标地址的距离称为跳转"偏移量",偏 移量是符号数. 移量是符号数.
当用一个字节表示偏移量时 当用一个 字节表示偏移量时 , 即源地址与目标地址之距 字节 表示偏移量时, 127~ 128之间 称为" 之间, short)转移 转移" 在+127~-128之间,称为"短(short)转移"; 当用一个字表示偏移量时, 当用一个 字 表示偏移量时 , 即源地址与目标地址之距在 32767~ 32768之间 称为" 之间, near)转移 转移" +32767~-32768之间,称为"近(near)转移".
3 过程调用和返回指令
如果有一些程序需要在不同的地方多次出现, 如果有一些程序需要在不同的地方多次出现 , 则可 以将这些程序段设计成过程(即子程序) 以将这些程序段设计成过程 (即子程序) ,供需要时 调用. 调用. 在过程(即子程序)中要安排返回指令, 在过程 ( 即子程序 )中要安排返回指令 ,使得过程结 束时,返回到调用处. 束时,返回到调用处. 如: 显示一个字符,需要利用下列程序段完成: 显示一个字符,需要利用下列程序段完成:
续表
特征 助记符 JA / JNBE JBE / JNA 转移条件 CF∨ZF=0 CF∨ZF=0 CF∨ZF=1 CF∨ZF=1 SF⊕OF=0 SF⊕OF=0 SF⊕OF=1 SF⊕OF=1 ( SF⊕OF)∨ZF =0 ( SF⊕OF)∨ZF =1 CX=0 CX=0 符号数 说明 大于 或 不小于等于 转移 小于等于 或 不大于 转移 大于等于 或 不小于 转移 小于 或 不大于等于 转移 大于 或 不小于等于 转移 小于等于 或 不大于 转移
调用 类型
寻址 方式
格 式
操 作
示 例
说 明
procCALL proc-name 直接 disp16 CALL disp16 段内 调用 CALL BX 间接 CALL r16 / m16 ①IP入栈; IP入栈; 入栈 (r16)/(m16 16)/(m16) ②IP← (r16)/(m16) CALL WORD PTR [BX] ①IP入栈; IP入栈; 入栈 ②IP ← IP + 偏移量 SUB1 CALL SUB1
mov dl,'a' mov ah,2 int 21h
DL寄存器保存 DL寄存器保存 要显示的Leabharlann Baidu符 ASCII码 的ASCII码
过程与调用程序在同一段内, 过程与调用程序在同一段内,称"段内调用"; 段内调用" 过程与调用程序不在同一段内, 过程与调用程序不在同一段内,称"段间调用". 段间调用" 过程调用指令为:CALL 过程调用指令为: 返回指令为: 返回指令为:RET 过程调用与返回指令均不影响标志位,但影响堆栈. 过程调用与返回指令均不影响标志位,但影响堆栈. 不影响标志位
无符号 数
多 标 志 位
JGE / JNL JL / JNGE JG / JNLE JLE / JNG
CX
JCXZ
【例】比较两个字属性的符号数X,Y的大小,如果X>Y, 比较两个字属性的符号数X 的大小,如果X>Y, X>Y AL为 如果X=Y AL为 X=Y, 如果X<Y AL为 FFH. X<Y, AL为1,如果X=Y,AL为0,如果X<Y,AL为0FFH. 为内存变量,功能实现主要代码如下: 解:设X,Y为内存变量,功能实现主要代码如下: AX, MOV AX,X AX, CMP AX,Y JLE LE MOV AL,1 AL, ;X > Y,AL=1 AL=1 JMP DONE LE: LE:JL L AL,00H AL=00 00H MOV AL,00H ;X = Y,AL=00H JMP DOWN AL, AL=0 L:MOV AL,0FFH ;X < Y,AL=0FFH DONE: DONE:HLT
名称
格式
操作 ① CX ← CX – 1 ② 如 果 CX = 0, 结 束 循 执行后续语句. 环 , 执行后续语句 . 否则 转移到标号处. 转移到标号处. ① CX ← CX – 1 如果CX ② 如果 CX = 0 或 ZF= 0, 结束循环, 结束循环 , 执行后续语句 否则转移到标号处. .否则转移到标号处. ① CX ← CX – 1 如果CX ZF=1 ② 如果 CX =0 或 ZF=1, 结 束循环, 执行后续语句. 束循环 , 执行后续语句 . 否则转移到标号处. 否则转移到标号处.
转移指令又可分为两类: 转移指令又可分为两类:
无条件转移指令 条件转移指令
无条件转移指令JMP 无条件转移指令
格式:JMP dest 格式: 说明: 说明:
dest可以是标号,立即数,寄存器,内存操作 可以是标号,立即数,寄存器, 可以是标号 数.
类 型
寻址 方式 直接
操作数 地址符号
目标地址计算 IP ← IP + 偏移量 CS不变 CS不变 IP ← 寄 存器 IP ←( 存 储器) 储器) JMP NEXT
间接 存储器 地址符号
CS不 CS不 变
段 间 转 移
直接 立即数(32位 立即数 ( 32 位 ) 间接 内存(双字) 内存(双字)
IP ← 目标偏移地址 立即数低16 16位 /立即数低16位 CS ← 目 标 段 地 址 / 立即数高16 16位 立即数高16位 (EA+1 IP ← (EA+1,EA) (EA+3 EA+2 CS ← (EA+3,EA+2)
说明
大于等于 或 不小于 转移
小于 或 不大于等于
有进位或借位 转移 无进位/ 无进位/借位 转移 等于转移 不等于 转移 无溢出 转移 有溢出 转移 1的个数为奇数 转移 1的个数为偶数 转移 正数 转移 负数 转移
单 标 志 位
JZ JNZ JNO JO JNP / JPO JP / JPE JNS JS
循环 指令
LOOP
ShortShort-label
相等循 环指令
ShortLOOPZ/LOOPE Shortlabel
不相等 循环指 令
ShortLOOPNZ/LOONE Shortlabel
【例】有一首地址为Array的长度为M字数组,试编写实现下列功能 有一首地址为Array的长度为M字数组, Array的长度为 的代码:统计出数组中0元素的个数,并存入变量total total中 的代码:统计出数组中0元素的个数,并存入变量total中. CX, 数组长度存入循环计数器CX MOV CX,M ;数组长度存入循环计数器CX total, 计数变量初始值为0 MOV total,0 ;计数变量初始值为0 SI, 初始偏移量送寄存器SI MOV SI,0 ;初始偏移量送寄存器SI AGAIN:MOV AX,Array[SI] AX, ;取数 AX, CMP AX,0 ;与0比较 不为0 JNZ NEXT ;不为0,取下一个数 计数器加1 INC total ;为0,计数器加1 SI, 调整地址, NEXT:ADD SI,2 ;调整地址,指向下个数 LOOP AGAIN ;进入下一轮循环 显然, AGAIN指令的功能与下列语句相同 指令的功能与下列语句相同: 显然,LOOP AGAIN指令的功能与下列语句相同: DEC CX JNZ AGAIN 但是,LOOP指令中完成的操作CX←CX指令中完成的操作CX←CX 不影响标志位. 但是,LOOP指令中完成的操作CX←CX-1,不影响标志位.
示例 SHORT
说明
段 内 转 移
立即数( 立即数 ( 偏移 量) 寄存器
2100H JMP 2100H JMP BX JMP [BX] JMP FAR PTR NEXT JMP 21000100H 21000100H JMP DWORD PTR [BX]
①SHORT 表示短跳; 表示短跳; ②FAR表 FAR表 示段间跳 ; ③DWORD PTR表明 PTR表明 内存操作 数属性为 双字
过程调用的寻址方式
直接寻址
调用指令中直接给出被调用过程的首地址( 调用指令中直接给出被调用过程的首地址(标号或 立即数). 立即数)
间接寻址
预先把被调用过程的地址存于寄存器或内存, 预先把被调用过程的地址存于寄存器或内存,调用 指令仅给出这些地址存放处(寄存器名或内存地址), 指令仅给出这些地址存放处(寄存器名或内存地址) 间接寻址" 为"间接寻址".
(2) 条件转移指令
格式:Jcc short-label 格式: short说明: 说明: cc代表跳转条件 该指令只能实现段内短转移. 代表跳转条件, cc代表跳转条件,该指令只能实现段内短转移.
特征
助记符 JAE / JNB JB /JNAE JC JNC
转移条件 CF=0 CF=0 CF=1 CF=1 CF=1 CF=1 CF=0 CF=0 ZF=1 ZF=1 ZF=0 ZF=0 OF=0 OF=0 OF=1 OF=1 PF=0 PF=0 PF=1 PF=1 SF=0 SF=0 SF=1 SF=1 无符 号数