当前位置:文档之家› 微机原理与接口技术-第4章指令系统9 44页

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

28H 48H 33H 51H 37H 39H 42H 76H 59H ……
21
2.循环控制指令
用在循环程序中以确定是否要继续循环。 循环次数通常置于CX中。 转移的目标应在距离本指令-128~+127的范围之 内。 循环控制指令不影响标志位。
22
(1)LOOP -- 循环计数
格式:LOOP label 操作:CX-1→CX;
[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位
例中的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
条件转移指令可实现程序的条件分支。 条件转移指令根据标志位的状态来决定是否进行分 支转移。 格式:
说明:寄存器、内存单元存放的是有效地址。所
谓“间接”,是指当CPU执行指令时,将寄存器或
内存单元内的有效地址写入IP或EIP,从而实现转
移。
6
例2:JMP [BX+DI] 设指令执行前:
DS=3000H,BX=1300H, DI=1200H,[32500H]=2350H; 则指令执行后:IP=2350H
在汇编语言中,段内间接寻址通常写成: 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
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
找最大数
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指令后面的第 一条指令地址(断点地址)。
;直接转向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
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]
JNB/JAE JB/JNAE
教材P108
14
表4-6 判断有符号数大小的条件转移指令
助记符
指令功能
助记符
JG
被减数(真值)大于减数(真值)转
JNLE
JGE 被减数(真值)大于或等于减数(真值)转 JNL
JL
被减数(真值)小于减数(真值)转
JNGE
JLE 被减数(真值)小于或等于减数(真值)转 JNG
段间返回指令RET的操作为:(RETF) 恢复子程序执行前CS:IP的内容。
JC(JB/JNAE)
为0时转移 JNZ(JNE)
JNS JNO JNP(JPO) JNC(JNB/JAE)
教材P108
13
表4-5 判断无符号数大小的条件转移指令
操作码助记符
指令功能
JA
被减数大于减数转
JNA
被减数小于或等于减数转
JNC
被减数大于或等于减数转
JC
被减数小于减数转
等价助记符 JNBE JBE
主程序
… CALL PROC1
子 程序 SUB- PROC1 PROC
(子程序入口地址)
MOV AL,0100H

① CALL PROC1 ③(断点地址)MOV AL
… CALL PROC1 XOR AX,AX …
, 0100H
② RET
29
1)子程序调用指令
一般格式:CALL sub ;sub为子程序的入口 根据子程序入口的寻址方式,子程序调用有四类:
例:JMP 2000H:1000H
执行时, IP←1000H, CS←2000H
注:直接地址为符号地址时,段间直接转移指令中 的符号地址前应加操作符FAR PTR。
例:JMP FAR PTR label 在模块设计时,从一个模块转移到另一个模块, 用段间直接转移。
9
④段间间接转移 格式:JMP mem32
mem低16=>IP mem高16=>CS
功能:跨段跳转到由一个双字内存单元的内容确 定的地址处执行。例如:
JMP DWORD PTR[SI]
设指令执行前:DS=4000H,SI=1212H,
[41212H]=1000H,[41214H]=4A00H
则指令执行后:IP=1000H,CS=4A00H
于是转到4B000H处开始执行指令。
(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寄存器内容入栈:
(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处执行。指令中直接 给出要转移到的目的段地址和偏移地址。
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
例: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的内容。
4.3 80x 逻辑运算和移位指令 串操作指令 程序控制指令 处理器控制指令 中断指令
相关主题