微机原理与接口技术-第4章指令系统9 44页

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
若CX≠0,则转至label处执行; 否则退出循环,执行LOOP后面的指令。
注:LOOP指令与下面的指令段等价,但不影响标 志位。
DEC CX JNZ label
23
Biblioteka Baidu
(2)LOOPZ (LOOPE) -- 相等继续
格式:LOOPZ label 操作:CX-1→CX;
若CX≠0∧ZF=1,则转至label处执行; 否则退出循环,执行LOOP后面的指令。
在汇编语言中,段内间接寻址通常写成: JMP WORD PTR[BX+DI]
表示所取得的目标地址是一个字。
7
P107例子(改错)
DS: POINTER DW P11
DW P12

CS: ...
MOV BX, OFFSET POINTER
JMP WORD PTR [BX]

MOV SI, OFFSET POINTER+2
段间返回指令RET的操作为:(RETF) 恢复子程序执行前CS:IP的内容。
例:CALL DWORD PTR [DI]
33
CALL DWORD PTR[DI] IPH IPL
CALL
代码段
CSH CSL
[DI] [DI]+1 [DI]+2 [DI]+3
数据段
段间间接调用示意图
34
2)子程序返回指令RET
段内返回指令RET的操作为:(RETN) 恢复子程序执行前IP的内容。
mem低16=>IP mem高16=>CS
功能:跨段跳转到由一个双字内存单元的内容确 定的地址处执行。例如:
JMP DWORD PTR[SI]
设指令执行前:DS=4000H,SI=1212H,
[41212H]=1000H,[41214H]=4A00H
则指令执行后:IP=1000H,CS=4A00H
于是转到4B000H处开始执行指令。
4.3 80x86指令系统
可分成如下7类:
数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 程序控制指令 处理器控制指令 中断指令
1
4.3.4 程序控制指令
用于控制指令流程的指令有转移、循环、过 程调用和中断调用等指令。 分类
– 按转移条件分:无条件转移和有条件转移; – 按转移的范围分:段内转移和段间转移; – 按获取地址的方法分:直接转移和间接转移。
JAE LABLE MOV AL, [BX]
;条件成立,转移 ;这条指令不执行
2000H
2019H 2019H 2019H 2019H 2019H 2019H 2019H 2019H 2009H …… 2100H
36H
28H 48H 33H 51H 37H 39H 42H 76H 59H ……
20
找最大数
说明:寄存器、内存单元存放的是有效地址。所
谓“间接”,是指当CPU执行指令时,将寄存器或
内存单元内的有效地址写入IP或EIP,从而实现转
移。
6
例2:JMP [BX+DI] 设指令执行前:
DS=3000H,BX=1300H, DI=1200H,[32500H]=2350H; 则指令执行后:IP=2350H
CS: 对DS初始化 MOV CX,100 LEA BX,ARRAY MOV SI,0FFFEH ; -2
ZERO: INC SI INC SI CMP WORD PTR [BX+SI],0 LOOPZ ZERO MOV AX,[BX+SI]
26
3. 过程调用和返回指令
主程序调用子程序,用CALL指令实现,子程序 结束须用一条返回指令RET返回到主程序。 CPU在读取CALL指令时,IP自动递增,使它指 向下一条指令的存储单元地址。 CALL指令执行时,必须保存CALL指令后面的第 一条指令地址(断点地址)。
JC(JB/JNAE)
为0时转移 JNZ(JNE)
JNS JNO JNP(JPO) JNC(JNB/JAE)
教材P108
13
表4-5 判断无符号数大小的条件转移指令
操作码助记符
指令功能
JA
被减数大于减数转
JNA
被减数小于或等于减数转
JNC
被减数大于或等于减数转
JC
被减数小于减数转
等价助记符 JNBE JBE
JNB/JAE JB/JNAE
教材P108
14
表4-6 判断有符号数大小的条件转移指令
助记符
指令功能
助记符
JG
被减数(真值)大于减数(真值)转
JNLE
JGE 被减数(真值)大于或等于减数(真值)转 JNL
JL
被减数(真值)小于减数(真值)转
JNGE
JLE 被减数(真值)小于或等于减数(真值)转 JNG
27
CALL指令的功能: – 先将断点地址 (IP或CS:IP)压栈, – 然后将子程序首地址送IP或CS:IP中,从而转
到子程序入口, – 再顺序执行子程序。 返回指令RET在子程序最后。CPU执行返回指令 时,会从堆栈中弹出断点地址,重新装入IP 或 CS:IP中,从而返回主程序。
28
图4.36 子程序调用与返回
28H 48H 33H 51H 37H 39H 42H 76H 59H ……
21
2.循环控制指令
用在循环程序中以确定是否要继续循环。 循环次数通常置于CX中。 转移的目标应在距离本指令-128~+127的范围之 内。 循环控制指令不影响标志位。
22
(1)LOOP -- 循环计数
格式:LOOP label 操作:CX-1→CX;
例:JMP 2000H:1000H
执行时, IP←1000H, CS←2000H
注:直接地址为符号地址时,段间直接转移指令中 的符号地址前应加操作符FAR PTR。
例:JMP FAR PTR label 在模块设计时,从一个模块转移到另一个模块, 用段间直接转移。
9
④段间间接转移 格式:JMP mem32
int i, sum=0; for(i=100; i>=1; i--)
sum+=i;
MOV AX, 0 MOV CX, 100 NEXT: ADD AX, CX DEC CX JNZ NEXT
25
例(P110):找出以ARRAY为首地址的100个字数组中的第一 个非0元素,送入AX中。
DS: ARRAY DW 0,0,0,1010H,··· ;(100个数)
教材P109
15
根据CX内容来决定是否转移的转移指令 JCXZ label 若CX=0,则转移到label处开始执行。
16
例 P109
设有10个字节属性的无符号数据存放在以 2000H单元为首地址的数据缓冲器中,编 程找出其中的最大数,并存入2100H单元。
17
找最大数的程序 …
MOV BX,2000H
(1) 段内直接调用 格式:CALL sub 执行的操作:
① SP)← SP-2; ② 将IP寄存器内容入栈,
[SP] ←IP; ③ IP ← sub;
例:CALL 1000H CALL TIMER ;TIMER为子程序名
30
(2) 段内间接调用
格式: CALL MEM/REG 执行的操作: ① SP ← SP-2; ② 将IP寄存器内容入栈:
MOV AL, [BX]
MOV CX,9
; 正确取值应为9
LAB:
INC BX
CMP AL,[BX]
JAE LABLE
MOV AL, [BX]
LABLE: DEC CX
JNZ LAB
MOV BX,2100H
MOV [BX], AL
… 18
找最大数
AL 36H
MOV BX, 2000H MOV AL, [BX]
JXX label ;xx为条件名称缩写 指令的转移范围为-128~+127字节。
分类 – 判断单个标志的条件转移指令 – 判断无符号数大小的条件转移指令 – 判断有符号数大小的条件转移指令 – 循环控制转移
12
表4-4 判断单个标志的条件转移指令
标志 ZF SF OF PF CF
为1时转移 JZ(JE) JS JO JP(JPE)
例:CALL 2000H:1000H CALL TIMER ;TIMER为远过程
32
(4) 段间间接调用
格式:CALL MEM32 当CALL执行段间调用指令时,将当前的CS和IP 压栈,将目标的段基址和偏移量送给CS和IP。
执行的操作: ① SP ← SP - 2;[SP] ← CS ② SP ← SP - 2; [SP] ← IP ③ IP ← [MEM],CS ←[MEM+2]
INC BX CMP AL, [BX]
AL 36H
AL 4386H PK 48H [BX]
JAE LABLE MOV AL, [BX]
;条件不成立 ;执行这条指令
2000H
2019H 2019H 2019H 2019H 2019H 2019H 2019H 2019H 2009H …… 2100H
36H
2
1.转移指令
转移指令的实质:改变IP(或CS)的内容。 所有转移指令不会影响标志位。 分为无条件转移和条件转移两种。
3
1) 无条件转移指令 - JMP 本指令无条件转移到指定的目标地址,以执行 从该地址开始的程序段。根据设置CS、IP的方 法,JMP指令分成4种情况。
4
① 段内直接转移
;直接转向0120H
JMP SHORT LP
;转向LP
JMP NEAR PTR BBB ;转向BBB
由于是段内转移,故转移后CS内容保持不变
5
②段内间接转移
格式:JMP reg/mem
(reg/mem)16 => IP
功能:跳转到由寄存器或存储单元的内容给出目标 地址处执行。
例1:JMP SI
若(SI)=1200H,则指令执行后,(IP)=1200H,于是转 向代码段的偏移地址1200H处开始执行。
格式:JMP Lable
Lable=>IP
功能:跳转到Lable处开始执行下一跳指令。
指令代码中给出的目标地址实际上是一个相对于 IP的位移量:
位移量 转移范围
汇编语言中格式
8位 -128~+127
JMP SHORT OPRD
16位 -32768~+32767 JMP NEAR PTR OPRD
例:JMP 0120H
例中的DWORD PTR表示转移地址是一个双字。
10
JMP DWORD PTR [SI]的机器码
11111111 11101100
[DS:SI]
DS:SI 41212H
00
10
41214H
00
4A
1000 IP 4A00 CS
段间间接转移操作示意图
11
2)条件转移指令--Jxx
条件转移指令可实现程序的条件分支。 条件转移指令根据标志位的状态来决定是否进行分 支转移。 格式:
2000H
2019H 2019H 2019H 2019H 2019H 2019H 2019H 2019H 2009H …… 2100H
36H
28H 48H 33H 51H 37H 39H 42H 76H 59H ……
19
找最大数
INC BX CMP AL, [BX]
AL 36H
AL 36H PK 28H [BX]
[SP] ← IP ③ IP ← EA
例: CALL BX
;子程序地址由BX给出
CALL WORD PTR[SI] ;子程序地址在存储器中
31
(3) 段间直接调用
格式:CALL sub
注意:sub用FAR属性定义在另一代码段中
执行的操作: ① SP ← SP - 2;[SP] ← CS ② SP ← SP - 2; [SP] ← IP ③ IP ← sub低16位,CS ← sub高16位
主程序
… CALL PROC1
子 程序 SUB- PROC1 PROC
(子程序入口地址)
MOV AL,0100H

① CALL PROC1 ③(断点地址)MOV AL
… CALL PROC1 XOR AX,AX …
, 0100H
② RET
29
1)子程序调用指令
一般格式:CALL sub ;sub为子程序的入口 根据子程序入口的寻址方式,子程序调用有四类:
(3)LOOPNZ (LOOPNE) -- 不相等继续
格式:LOOPNZ label 操作:CX-1→CX;
若CX≠0∧ZF=0,则转至label处执行; 否则退出循环,执行LOOP后面的指令。
24
例:编写程序,计算 X=1+2+3+……+99+100,结 果保存到AX。
NEXT:
MOV AX, 0 MOV CX, 100 ADD AX, CX LOOP NEXT
JMP WORD PTR [SI]
P11: … P12: …
YYH POINTER+ 2 YYH
P12的地址信息
POINTER
XXH XXH
P11的地址信息
8
③段间直接转移
格式:JMP Lable
Lable低16=>IP Lable高16=>CS
功能:跨段跳转到far_Lable处执行。指令中直接 给出要转移到的目的段地址和偏移地址。
相关文档
最新文档