指令系统和寻址方式
1.教学目的:掌握微机寻址方式和8086微处理器指令系统
2.教学要求:
①熟悉指令构成,了解指令执行时间。
②掌握8种寻址方式。
③熟悉指令系统的六大类指令,要求结合上机实践熟练掌握常用指令。
④结合指令举例逐步熟悉和掌握汇编语言程序的格式,以及典型程序段。
⑤了解80x86和PENTIUM CPU扩充和增加的指令
3.教学重点:
①寻址方式
②8086微处理器指令系统
4.掌握难点:
①寄存器的应用
②存储器的结构
5.教学进程安排:P42~101
6.教学方法:
课堂讲授
7.教学内容摘要:
3.1 指令系统概述每条指令由两部分组成:操作码字段和地址码字段。格式如图3.1所示:
图3.1 指令格式
1.操作码字段
2.地址码字段
3.称为寻址方式
(1)立即寻址
(2)寄存器寻址
(3)存储器寻址
3.2 8088/8086 CPU的寻址方式
寻找和获得操作数或操作数存放地址或指令转移地址的方法称为寻址方式。8088/8086 CPU的寻址分为两类,即数据寻址和指令寻址。
3.2.1 数据寻址方式
1,立即寻址方式
【例3-2】 MOV AL,0FFH 【例3-3】 MOV AX,1234H
2,寄存器寻址
【例3-4】 MOV AX,BX
MOV AL,BL
3,存储器寻址方式
(1) 直接寻址方式
【例3-5】假设TABLE是在数据段定义的一个字节数组的首地址标号(变量名),其偏移地址为1000H,则指令
MOV AL,TABLE 或 MOV AL,TABLE+2
或 MOV AL,[TABLE] 或 MOV AL,[TABLE+2]
或 MOV AL,[1000H] 或 MOV AL,[1000H+2]
(2)寄存器间接寻址方式
【例3-8】 MOV AX,[BX]
MOV AX,[SI]
【例3-9】 MOV AX,[BX]
如果(DS)=3000H,(BX)=1010H,(31010H)=12H,(31011H)=24H。则操作数的20位物理地址=30000H+1010H=31010H,操作的示意图如图3.4所示。
指令执行完以后,(AX)=2412H。
图3.4 寄存器间接寻址操作图
【例3-10】MOV AX,ES:[BX]
(3)寄存器相对寻址
【例3-11】TABLE是在数据段定义的一个字节数组的首地址标号(也称变量名),则:
MOV SI,5
MOV AL,TABLE[SI] ;可以写为:MOV AL,[TABLE+SI]
ABC EQU 5
LEA SI,TABLE ;LEA是取偏址指令,本句是TABLE偏址→SI
MOV AL,ABC[SI] ;可以写为:MOV AL,[ABC+SI]
如:[BX+6]、[BP-100H]、[SI+OFFSET TABLE]都是寄存器相对寻址方式。
【例3-12】TABLE是数据段中定义的一个变量,假设它在数据段中的偏移地址为0100H,有指令:
MOV AX,TABLE[SI]
(4)基址变址寻址
【例3-13】 MOV AX,[BX] [SI]
或写为, MOV AX,[BX+SI]
【例3-14】MOV AX,[BX] [SI](或写为MOV AX,[BX+SI])
若(DS)=2000H,(BX)=0500H,(SI)=0010H
则偏移地址=0500H+0010H=0510H
20位物理地址=20000H+0510H
=20510H
如(20510H)=12H,(20511H)=34H,
操作的示意图如图3.5所示:
图3.5 基址变址寻址操作示意图
(5) 相对基址变址寻址
【例3-15】 MOV AL,TABLE[BX][SI]
【例3-16】TABLE是数据段中定义的一个符号地址,假设它在数据段中的偏移地址是1000H。
MOV AX,TABLE[BX][DI]
若(DS)=2000H,(BX)=0100H,(DI)=0020H
则偏移地址=1000H+0100H+0020H=1120H
20位物理地址=20000H+1120H=21120H
如(21120H)=12H,(21121H)=34H,操作的示意图如图3.6所示。
执行完指令以后,(AX)=3412H。
图3.6 相对基址变址寻址操作示意图
3.2.2指令寻址方式指令寻址方式是指确定下一条要执行指令的地址的方法。这里只介绍有关转移指令及调用指令的指令寻址方式。
1,段内直接寻址这种寻址方式的汇编格式有三种:
①指令名 SHORT 转移目标地址标号
②指令名 转移目标地址标号
③指令名 NEAR PTR 转移目标地址标号
2,段间直接寻址这种寻址方式的汇编格式有以下两种形式:
①指令名 FAR PTR 转移地址标号
②指令名 段地址:段内偏移地址
3,段内间接寻址这种寻址方式的汇编格式为:
①指令名 16位寄存器名
②指令名 WORD PTR 存储器寻址方式
4,段间间接寻址这种寻址方式的汇编格式为:
指令名 DWORD PTR 存储器寻址方式
3.3 8088/8086 CPU的指令系统
3.3.1 数据传送指令
8086/8088有4类传送指令,分别是:①通用传送指令,②累加器专用传送指令,③地址传送指令,④标志传送指令通用传送指令
操作码
MOV
PUSH
POP
PUSHF
POPF
XCHG
操作功能
通用传送
入栈
出栈
标志压栈
标志出栈
交换
⑴通用传送指令MOV
①从寄存器到寄存器
②从寄存器到段寄存器
③从寄存器到存储器
④从段寄存器到寄存器
⑤从存储器到寄存器
⑥从段寄存器到存储器
⑦从存储器到段寄存器
⑧从立即数到寄存器
⑨从立即数到存储器

图3.7 MOV指令的九种形式
⑵进栈指令PUSH及出栈指令POP
①PUSH指令
②POP指令
【例3-18】MOV AX,1234H
PUSH AX 设执行前(SS)=2000H,(SP)=00FEH
指令执行过程如图3.8所示。执行后(SS)=2000H,(SP)=00FCH
图3.8 压栈操作示意图
⑶PUSHF
⑷POPF
【例3-19】若想设置TF=1,程序段如下:
PUSHF
POP AX
OR AH,01H ;修改TF位
PUSH AX
POPF
⑸XCHG指令
2,累加器专用传送指令
(1)IN 输入指令
(2)OUT 输出指令
(3)XLAT 换码指令
3,地址传送指令操作码
LEA
LDS
LES
操作功能
取偏址
取偏址和数据段值
取偏址和附加数据段值
4,标志传送指令
3.3.2 算术运算指令
1,加法指令操作码
ADD
ADC
INC
操作功能
加法
带进位加法
增量
2,减法指令操作码
SUB
SBB
DEC
NEG
CMP
操作功能
减法
带借位减法
减1
求补
比较
3,乘法指令
⑴MUL 无符号数乘法指令汇编格式:MUL 源操作数执行的操作:若为字节操作:(AX)←(AL)×源操作数若为字操作:(DX-AX)←(AX)×源操作数
⑵IMUL 有符号数乘法指令
4,除法指令
⑴DIV 无符号数除法指令汇编格式:DIV 源操作数
⑵IDIV 有符号数除法指令汇编格式:IDIV 源操作数
5,符号扩展指令
⑴CBW:字节转换为字指令
⑵CWD:字转换为双字指令
6,十进制调整指令
⑴压缩的BCD码调整指令
①DAA
②DAS
⑵非压缩的BCD码调整指令
①AAA
②AAS
3.3.3 逻辑运算和移位指令
1,逻辑运算指令操作码
AND
OR
NOT
XOR
TEST
操作功能
与
或
非
异或
测试
表3-1 逻辑运算指令对标志位的影响指令
OF
CF
SF
PF
ZF
AF
AND
=0
=0
0或1
0或1
0或1
无定义
OR
=0
=0
0或1
0或1
0或1
无定义
XOR
=0
=0
0或1
0或1
0或1
无定义
TEST
=0
=0
0或1
0或1
0或1
无定义
NOT
不影响
不影响
不影响
不影响
不影响
不影响
 2,移位指令
图3.10 循环移位指令操作
【例3-37】将(AX)乘以10
3.3.4 串操作指令有关串操作的指令有5条,分别为:①MOVS ②LODS ③STOS ④CMPS ⑤SCAS
1,串传送指令
(1)格式:
REP MOVS/LODS/STOS
(2)执行的操作:
(3)MOVS指令
(4)LODS指令
(5)STOS指令
2,串比较指令
(1)REPE/REPZ CMPS/SCAS
(2)REPNE/REPNZ CMPS/SCAS
(3)CMPS指令
(4)SCAS指令
【例3-38】假设有一起始地址为BLOCK,长度为100个字节的存储区,现要对这一存储区进行测试,看其中是否有内容为00H的存储单元。
3.3.5 控制转移指令
1,无条件转移指令JMP
⑴段内直接转移
①段内直接短转移
②段内直接近转移
⑵段内间接转
⑶ 段间直接转移
2,条件转移指令表3-2 简单条件转移指令表汇编语言指令名
测试条件
操作
JZ(或JE)
ZF=1
结果为零(或相等)则转移
JNZ(或JNE)
ZF=0
结果不为零(或不相等)则转移
JS
SF=1
结果为负则转移
JNS
SF=0
结果为正则转移
JO
OF=1
结果溢出则转移
JNO
OF=0
结果无溢出则转移
JP(或JPE)
PF=1
奇偶位为1则转移
JNP(或JPO)
PF=0
奇偶位为0则转移
JC(或JNAE或JB)
CF=1
有进位则转移
JNC(或JAE或JNB)
CF=0
无进位则转移
表3-3 无符号数比较条件转移指令表汇编语言指令名
测试条件
操作
JB(或JNAE或JC)
CF=1
低于,或不高于或等于,或进位位为1则转移
JNB(或JAE或JNC)
CF=0
不低于,或高于或等于,或进位位为0则转移
JA(或JNBE)
CF∨ZF=0
高于,或不低于或等于则转移
JNA(或JBE)
CF∨ZF=1
不高于,或低于或等于则转移
表3-4 有符号数比较条件转移指令汇编语言指令名
测试条件
操作
JL(或JNGE)
SF∨OF=1
小于,或不大于或等于则转移
JNL(或JGE)
SF∨OF=0
不小于,或大于或等于则转移
JG(或JNLE)
(SF∨OF)∨ZF=0
大于,或不小于或等于则转移
JNG(或JLE)
(SF∨OF)∨ZF=1
不大于,或小于或等于则转移
3,子程序调用和返回指令
⑴CALL调用指令
①段内直接调用
② 段间直接调用
③ 段内间接调用
④ 段间间接调用
⑵RET返回指令返回指令
段内返回
段间返回
段内带立即数返回
段间带立即数返回
汇编格式
RET
RET
RET 表达式
RET 表达式
执行操作
(IP)←((SP)+1,(SP))
(SP)←(SP)+2
(IP)←((SP)+1,(SP))
(SP)←(SP)+2
(CS)←((SP)+1,(SP))
(SP)←(SP)+2
(IP)←((SP)+1,(SP))
(SP)←(SP)+2
(SP)←(SP)+16位表达式
(IP)←((SP)+1,(SP))
(SP)←(SP)+2
(CS)←((SP)+1,(SP))
(SP)←(SP)+2
(SP)←(SP)+16位表达式
4,循环指令
(1)循环指令共有3条,LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE,
(2)汇编格式:指令名 循环入口的地址标号
(3)执行的操作:
①(CX)←(CX)-1
②判断测试条件,若条件成立,则:
(IP)←(IP)+8位位移量表3-5 循环指令测试条件指令名
测试条件
功能
LOOP
(CX)≠0
无条件循环
LOOPNZ/LOOPNE
(CX)≠0且ZF=1
当为零或相等时循环
LOOPNZ
(CX)≠0且ZF=0
当不为零或不相等时循环
【例3-54】循环指令应用于软件延时
5,中断指令和中断返回指令表3-6 中断指令指令
INT
INT0
IRET
汇编格式
INT n
INTO
IRET
执行操作
(SP)←(SP)-2
((SP)+1,(SP))←(PSW)
IF=0,TF=0
(SP)←(SP)-2
((SP)+1,(SP))←(CS)
(SP)←(SP)-2
((SP)+1,(SP))←(IP)
(IP)←(n×4)
(CS)←(n×4+2)
若OF=1则:
(SP)←(SP)-2
((SP)+1,(SP))←(PSW)
IF=0,TF=0
(SP)←(SP)-2
((SP)+1,(SP))←(CS)
(SP)←(SP)-2
((SP)+1,(SP))←(IP)
(IP)←(0010H)
(CS)←(0012H)
(IP)←((SP)+1,(SP))
(SP)←(SP)+2
(CS)←((SP)+1,(SP))
(SP)←(SP)+2
(PSW)←((SP)+1,(SP))
(SP)←(SP)+2
说明
本条指令除把IF和TF位置0外,不影响其余的标志位。
本条指令除把IF和TF位置0外,不影响其余的标志位。
3.3.6 处理器控制指令
1,标志设置指令表3-7 标志设置指令指令格式
指令功能
执行的操作
CLC
STC
CMC
进位位置0指令进位位置1指令进位位求反指令
CF←O
CF←1
CF←
CLD
STD
方向标志位置0指令方向标志位置1指令
DF←0
DF←1
CLI
STI
中断标志位置0指令中断标志位置1指令
IF←0
IF←1
2,其它处理机控制指令
⑴NOP 无操作指令
⑵HLT停机指令
⑶WAIT 等待指令
⑷LOCK总线封锁指令
⑸ESC交权指令
3.4 80X86和PENTIUM CPU扩充和增加的指令
3.4.1 数据传送指令
1,通用传送类指令
⑴基本传送指令
①80386~PENTIUM指令系统中扩充了MOV指令功能,允许其传送双字。
②在80386~PENTIUM PRO指令系统中,增加了两条传送指令:MOVSX和MOVZX指令。
MOVSX:将源操作数进行符号扩展后再传送。
MOVZX:将源操作数进行零扩展后再传送。
③CMOV指令组
⑵入栈指令及出栈指令
①80286~PENTINM PRO指令系统增加了PUSHA(PUSHALL)入栈指令,及POPA(POPALL)出栈指令。
②80386~PENTIUM PRO中增加了PUSHAD和POPAD两条堆栈指令。
⑶交换指令在80386~PENTIUM PRO中,XCHG指令允许交换双字数据。
2,累加器专用传送指令
⑴输入类指令
⑵输出类指令
3.地址传送指令
3.4.2 算术运算指令
1,加法指令
2,减法指令
3,乘法指令
4,除法指令
5,符号扩展指令
3.4.3 逻辑运算和移位指令
1,逻辑运算类指令
⑴BT指令
⑵BTC指令
⑶BTR指令
⑷BTS指令
2,移位指令
⑴SHLD指令
⑵SHRD指令
3,位扫描指令
⑴BSF指令
⑵BSR指令:
3.4.4 串操作指令
1.扩充SCAS指令
2.扩充MOVS指令
3.扩充LODS指令
4.扩充STOS指令
5.扩充CMPS指令
3.4.5 控制转移指令
1,无条件转移和条件转移指令
⑴无条件转移指令
⑵条件转移指令
2,子程序调用和返回指令
⑴子程序调用指令
⑵返回指令
4,循环控制指令
3.4.6 处理器控制指令
1,WAIT指令
2,BOUND指令
3,ENTER和LEAVE指令
3.4.7 条件置位指令表3-8 条件置位指令组的助记符及测试条件汇编语言助记符
测试条件
操作
SETB
CF=1
低于则置位
SETBE
CF=1或ZF=1
低于或等于则置位
SETA
CF=0且ZF=1
高于则置位
SETAE
CF=0
高于或等于则置位
SETE/SETZ
ZF=1
相等或结果为零则置位
SETNE/SETNZ
ZF=0
不相等或结果不为零则置位
SETL
SF=1
小于则置位
SETLE
SF=1或ZF=1
小于或等于则置位
SETG
SF=0且ZF=0
大于则置位
SETGE
SF=0
大于或等于则置位
SETS
SF=1
结果为负则置位
SETNS
SF=0
结果为正则置位
SETC
CF=1
结果有进位则置位
SETNC
CF=0
结果无进位则置位
SETO
OF=1
结果无溢出则置位
SETNO
OF=0
结果无溢出则置位
SETP
PF=1
奇偶位为1则置位
SETNP
PF=0
奇偶位为0则置位
表3-9 80x86~PENTIUM特殊指令汇编指令助记符
作用
CLTS
清除任务切换标志
LDGT
装载全局描述符表寄存器
SGDT
保存全局描述符表寄存器
LIDT
装载中断描述符表寄存器
SIDT
保存局部中断描述符表寄存器
LLDT
装载局部描述符表寄存器
SLDT
保存局部描述符表寄存器
LMSW
装载机器状态字
SMSW
保存机器状态字
LAR
装载访问权限
SAR
保存访问权限
LSL
装载段限界
ARPL
调整请求优先级
VERR
检验是否可读
VERW
检验是否可写
CPUID
返回CPU标识码
RDTSC
读时间戳计数器
RDMSR
读模式定义寄存器
WRMSR
写模式定义寄存器
MSR
从系统管理中断中返回
8.参考资料:《IBM-PC汇编语言程序设计》沈美明
9.作业:P99 习题3
10.本章小结:
①本部分为汇编语言编程基础,应该熟练掌握。
②注意各条指令的特点及其用途。