1
微机原理及应用
主讲:谢维成
http://xweicheng.ys168.com
scxweicheng@yahoo.com.cn
2 西华大学电气信息学院
第
第
3章
章
8086寻址方式和指令系统
寻址方式和指令系统
(3版
版
P43; 4版
版
P24/67)
)
3.1 8086/8088的寻址方式
寻址方式:指出操作数的来源。
1 立即寻址: (如下页图3-1所示)
操作数直接在指令中,紧跟在操作码之
后,作为指令的一部分放在码段中。
例 :MOV AL,64H ;AL←64H
MOV AX,2058H ;AX←2058H
3 西华大学电气信息学院
地
址
增
加
存储器
OP
58
20
代
码
段
AX
操作码
ALAH
操作数
图3-1 立即寻址示意图
4 西华大学电气信息学院
立即数只能为整数,且只能做源操作数
立即数只能为整数,且只能做源操作数
MOV AX,2058H ;AX←2058H
目
的
操
作
数
源
操
作
数
5 西华大学电气信息学院
2 寄存器寻址
操作数就在CPU的内部寄存器中,寄存器
名由指令指出。
例 : DEC BL ;将BL的内容减1
MOV DX,AX ;将AX中的值送入DX中
3 直接寻址
操作数的偏移地址(常称有效地址EA)直
接包含在指令中,放在操作码之后,见下页
图2-2
6 西华大学电气信息学院
例 : MOV AX,[1000H]
其示意图如图3-2所示
58
20
ALAH
00
10
21000
20000
存储器
OP
代
码
段
AX
数
据
段
图3-2 直接寻址示意
7 西华大学电气信息学院
对此例,没有用前缀指明操作数在哪 一段 ,
则默认在数据段中,设(D S) =2000H,则操作数
的物理地址为:20000+1000=21000H
于是访问该存储器取出其内容送AX
又例 :MOV BX,ES:[1000H]
则是将E S段的1000H及1 001H两单元内容取出送B X。
在汇编语言中,可用 符号地址 代替 数值地址 ,
如 : MOV AX,BUFFER ; 其 中 BUFFER为 存 放 操 作
数的符号地址.
而 MOV AX,[BUFFER] 与上式等效
8 西华大学电气信息学院
4 寄存器间接寻址
寄存器间接寻址
利用这种寻址方式时, 操作数在存储器中 ,而
操作数有效地址由 BX、BP、SI 和 DI中的一个指出,
若未用前缀指明,默认关系为:
对BX、SI、DI默认在 DS段中
对BP默认在 SS段中
例: MOV AX,[DI]
设(DS)=3000H,(DI)=2000H
该指令将32000H和 32001H两存储单元中的内容
送AX
9 西华大学电气信息学院
5 寄存器相对寻址
寄存器相对寻址
利用寄存器间接寻址时。允许在指令中指定
一个8位或16位的位移量,这样有效地址EA的构
成为:
[BX]
[BP] 8位位移量
[SI] 16位位移量
[DI]
例 :MOV AX,[COUNT+BP]
若(SS)==5000H,(BP)=3000H,COUNT=2040H
EA=
+
10 西华大学电气信息学院
则寻址示意图如图
则寻址示意图如图
3-4所示
所示
存储器
OP
48
55
ALAH
40
20
55040
50000
OP
物理地址为:
50000+3000+2040
=55040H
操作码
代
码
段
位移量
COUNT
AX
堆
栈
段
图3-4 寄存器相对寻址示意图
11 西华大学电气信息学院
6 基址加变址寻址
基址加变址寻址
操作数的有效地址是一个基址寄存器内容加
上 一 个 变 址 寄 存 器 内 容 , 默 认 的 段寄存器关系同
上。
例 :MOV AX,[BX+SI]
若(DS)=3200H,(BX)=0456H,
(SI)=1094H,
其寻址示意图如下页图3-5所示
12 西华大学电气信息学院
67
45
AX
ALAH 32456
334EA
(SI)
(BX)
物理地址为:
32000+0456+1094
=334EAH
存储器
32000
数
据
段
图3-5 基址加变址寻址示意图
13 西华大学电气信息学院
7 相对的基址加变址寻址
相对的基址加变址寻址
基址加变址也允许带一个8 位 或1 6位的位
移量,
例: MOV AX,[MASK+BX+DI]
设:(DS)=3000H,(BX)=1346H
(DI)=0500H,MASK=1234H
其执行情况如下页图3-6所示
14 西华大学电气信息学院
存储器
OP
48
55
ALAH
34
12
32A7A
30000
OP
31346
3257A
(DI)
(BX)
MASK
图3-6 相对的基址
加变址寻址示意图
代
码
段
操作码
位移量
MASK
AX
数
据
段
15 西华大学电气信息学院
寻址方式总结
寻址方式总结
(***)
1
2
3
4
1
2
3
4
、立即寻址
、寄存器寻址
、直接寻址
、间接寻址
( )基址寻址
( )基址 变址寻址
( ) 基址 变址 常量地址寻址
( )变址寻址
+
++
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
1、 MOV AX, 235AH
2、 MOV AX, BX
3、 MOV AX, [235AH]
4( 1) MOV AX, [BX] ; MOV AL, [BP]
( 2) MOV AX, [BX+SI]; MOV AX, [BX] [SI]
( 3) MOV AX, [BX+SI+2000H]
( 4) MOV AX, [DI]
16 西华大学电气信息学院
3.2 8086/8088指令系统
3.2.1 数据传送指令
3.2.2 算术运算指令
17 西华大学电气信息学院
3.4 IA-32的通用指令
的通用指令
可分成如下6类:
?数据传送指令
?算术运算指令
?逻辑运算和移位指令
?串操作指令
?控制转移指令
?处理器控制指令
18 西华大学电气信息学院
3.4.1 数据传送指令
数据传送指令
用来实现:寄←→寄,C PU← →存
CPU←→I /O 之间的数据传送。这是一种最基 本 、
最重要的操作。这类指令又可分为如下四种:
?通用传送
?累加器专用传送
?地址传送
?标志传送
19 西华大学电气信息学院
1.通用传送指令
通用传送指令
(1) MOV DST,SRC; DST←SRC
传送的是字节还是字取决于指令中涉及 的寄
存器是8位还是16位。
具体来说可实现:
① MOV MEM/REG1 ,MEM/REG2
式中两操作数中至少有一个为寄存器
例: MOV CL,DL
MOV AX,BX
MOV [SI],CX
MOV CL,[BX+5]
20 西华大学电气信息学院
②MOV REG,DATA ;立即数送寄存器
③MOV MEM/REG,DATA
④MOV AC,MEM ;存储单元送累加器
⑤MOV MEM,AC ;累加器送存储单元
⑥MOV SEGREG,MEM/REG ;段寄 存/寄
⑦MOV MEM/REG,SEGREG ; 存/寄 段 寄
21 西华大学电气信息学院
对
对
MOV指令小结
指令小结
可执行:
寄←→寄 ;但 CS,IP 不 能 作 目 的 寄 存
器
寄←→存 ;不能:存←存
寄,存←→段寄 ;不能:段寄←段寄
寄←立即数
存←立即数 ;不能:段寄←立即数
22 西华大学电气信息学院
几个不能送的 解决办法 :
MOV AL,MEM1 ;通过寄存器AL作桥梁
MOV MEM2,AL ;用来解决存←存
MOV AX,DS ;通过AX解决:
MOV ES,AX ;段寄←段寄
MOV AX,DATA ;通过AX解决:
MOV DS,AX ;段寄←立即数
23 西华大学电气信息学院
举例: 将1000H开始的100个存储单元送上ASCII
码2AH(*)。程序段如下:
MOV DI,1000H
MOV CX,64H
MOV AL,2AH
AGAIN:MOV [DI],AL
INC DI
DEC CX
JNZ AGAIN
INT 20H;若(CX)=0,返回DOS
24 西华大学电气信息学院
上程序段存放在 码段 中, 設 (CS)=109EH,则
各条指令存放地址如下:
CS : IP
109E:0100 MOV DI,1000H
109E:0103 MOV CX,64H
109E:0106 MOV AL,2AH
109E:0108 MOV [DI],AL
109E:010A INC DI
109E:010B DEC CX
109E:010C JNZ 0108
109E:010E INT 20H
109E:0110
25 西华大学电气信息学院
送上2AH(*)后。数据段中相应存储单元的内
容改变如下:
DS:1000 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A *****
DS:1010 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A *****
DS:1020 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A *****
DS:1030 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A *****
DS:1040 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A *****
DS:1050 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A *****
DS:1060 2A 2A 2A 2A 00 00 00 00 00 00 00 00 00 00 00 00 ****
***********
***********
***********
***********
***********
***********
26 西华大学电气信息学院
CS:IP 存 放指令
SS:SP 堆栈操作
DS+16位偏移量 存放操作数
ES+16位偏移量 存放操作数
一条指令包含两个部分:一部 分是 指令 操作
码,另一部分是操作数字段。前者指出执行什么
样操作,后者指出操作数放在什么地方?结果送
至何处?
27 西华大学电气信息学院
例:M OV DST,SRC ;目的源操作数放在什么地方?
即所谓寻址方式
寻址方式有7种:
立即寻址;寄存器寻址
直接寻址;寄存器间接寻址
寄存器相对寻址
基址加变址寻址
相对的基址加变址寻址
28 西华大学电气信息学院
(2)堆栈操作指令
堆栈操作指令
(3版
版
P53; 4版
版
P74)
)
堆栈:在内存中开辟若干单元作 为栈 区 ,
按 “后进先出 ” 方式工作。
为什么要设置堆栈?
为什么要按 “后进先出 ” 方式工作?
参见图3-7
29 西华大学电气信息学院
IP
执
行
子
程
序
转
子
程
序
压
栈
弹
出
返
回
主
程
序
IP(下 )
继
续
执
行
主
程
序
转
子
程
序
1
返
回
主
程
序
IP’
执
行
子
程
序
2
转
子
程
序
2
返
回
子
程
序
1
IP’(下 )
执行子
程序 1
继
续
执
行
子
程
序
1
(b)
压
栈
弹
出
主程序 主程序
IP
继
续
执
行
主
程
序
(a)
图 3-7 子程序调用示意图
(a) 主程序调子程序; (b) 子程序嵌套示意图
30 西华大学电气信息学院
堆栈规定设置在堆栈段S S内,堆栈指针
SP始 终 指向堆栈的顶部,S P的初值规定了所
用堆栈区的大小。堆栈的最高地址叫 栈底 。
① 压栈指令 PUSH SRC
例: PUSH AX ;将AX内容压栈
执行操作:(SP)-1←高字节AH
(SP)-2←低字节AL
(SP)←(SP)-2
31 西华大学电气信息学院
设(AX)=1020H,执行示意图如图3-8
执行前
(AX)=1020
10
图3-8 PUSH AX指令执行示意图
存储区
( SS段)
存储区
( SS段)
低地址
低地址
20(SP) AL
(SP)-2
AH
(SP)-1
(SP)
进栈方向
执行后
32 西华大学电气信息学院
注意进栈方向是高地址向低地址发展。
注意进栈方向是高地址向低地址发展。
压栈指令的格式为:
PUSH REG
PUSH MEM/REG
PUSH SEGREG
② 弹出指令 POP DST
例: POP BX ;将栈顶内容弹至BX
执行操作:(BL)←(SP)
(BH)←(SP)+1
(SP)←(SP)+2
33 西华大学电气信息学院
POP BX 的执行示意图如图3-9所示
存储区
( SS段) 低地址
出栈方向
执行前
20
10
图3-9 POP BX指令执行示意图
执行后
(BX)=1020
10
存储区
( SS段) 低地址
(SP)
20
(SP)+1
(SP)+2 (SP)
34 西华大学电气信息学院
POP指令的格式同P USH指令,堆栈指令使用时应注
意两点:①堆栈操作总是按 字 进行
②不能从栈顶弹出一个字给 CS
堆栈示意图 :
存储区
( SS段)
…
低地址
栈顶
(SP)
堆栈最后
一个字 进栈方向
栈底
35 西华大学电气信息学院
(3) 交换指令
交换指令
XCHG
格式为:XCHG REG,MEM/REG
要求两操作数中必须有一个在寄存器中,
不允许使用段寄存器。
举例: XCHG AX,BX
XCHG [2000],CL
36 西华大学电气信息学院
2. 累加器专用传送指令
累加器专用传送指令
所谓 专用 只限于用 累加器AL或AX 来传送信息。
完成的操作:CPU ?I/O端口
(1) 输入指令IN
格式:IN ac,PORT ;PORT端口号0~255H
IN ac,DX ;DX表示的端口范围达64K
例: IN AL,80H ;(AL)←(80H)
IN AX,DX ;(AX)←((DX)+1,(DX))
37 西华大学电气信息学院
(2)输出指令
输出指令
OUT
格式:OUT PORT,ac
OUT DX,ac
例: OUT 68H,AX ;(68+1,68H)←(AX)
OUT DX,AL ;((DX))←(AL)
在使用间接的IN/OUT指令时,在指令执行前,
应用传送指令对DX寄存器设置好端口号,
如: MOV DX,220H
IN AL,DX ;将220H端口内容读入AL
38 西华大学电气信息学院
(3)换码指令XLAT
执行的操作:(AL)←[(BX)+(AL)]
又叫 查表转换指令 ,它可根据表中代码的序号查
出 表中对应代码的内容。执行时先将表的首地址
(偏移地址)送到BX中,代码序号存于AL中。
例如: 内存数据段有一张16进制数的A SCII码
表 , 设 首 地址为2000H ,如图3-10所示,如欲查出
表中第11个代码(代码序号从0开始)即 B 的
ASCII码,(表中地址设(DS)=4000H)
39 西华大学电气信息学院
30
31
32
...
‘0’
‘1’
‘2’
39
41
42
...
‘9’
‘A’
‘B’
存储器
42000H+0
42000H+11
45
46
...
‘E’
‘F’
图3-10 十六进制数ASCII码表
40 西华大学电气信息学院
则可用如下几条指令实现:
MOV BX,2000H ;(BX)←表首地址
MOV AL,0BH ;(AL)←序号
XALT ; 查表转换
执行后得到:(AL)=42H
41 西华大学电气信息学院
3.地址传送指令
共有三条,我们只介绍LEA指令:
格式: LEA REG,MEM ;
将指定存储器的16位偏址送指定 寄 存
器. 指令要求 源操作数 必须是一个 内存
操作数 ,目的操作数必须是一个1 6位的
通用寄存器。
42 西华大学电气信息学院
例:
例:
LEA BX,
,
[SI+10H]
设:(SI)=1000H
则执行该指令后,(BX)=1010H
注意以下两条指令差别:
LEA BX,BUFFER 和 MOV BX,BUFFER
前者表示将符号地址为BUFFER的存储单
元的偏侈地址取到BX中; 后者表示将BUFFER
存储单元中的内容取到BX中。
43 西华大学电气信息学院
下面两条指令等效:
LEA BX,BUFFER 和
MOV BX, OFFSET BUFFER
其中OFFSET BUFFER表示存储器BUFFER的偏移
地址。
44 西华大学电气信息学院
4.标志传送指令
共有四条:
(1)读标志指令 LAHF
本指令把标志寄存器低8位中的5个标
志位传送到AH中的指定位,如下图2-11
所示:
45 西华大学电气信息学院
1
D
3
D
5
D
7
D
6
D
4
D
2
D
0
D
AH
OF DF IF
TF
SF
ZF AF
PF CF
(2) 设置标志指令 SAHF
SAHF的 功 能 与 LAHF的 功 能 正 好 相 反 , 用 图 来
示 意 , 只 要 将 图2-11中5个箭头方向反一下即可。
FLAG
图 3-11 LAHF指令的功能
46 西华大学电气信息学院
1
D
3
D
5
D
7
D
6
D
4
D
2
D
0
D
AH
OF DF IF
TF
SF
ZF AF
PF CF
FLAG
图3-11 SAHF指令的功能
(3) 设置标志指令 SAHF
SAHF的 功 能 与 LAHF的 功 能 正 好 相 反 , 用 图 来
示 意 , 只 要 将 图2-11中5个箭头方向 反一下 即可。
47 西华大学电气信息学院
(3)把标志寄存器推入栈顶指令 PUSHF
执行的操作:(SP)-1←标志寄存器高8位
(SP)-2←标志寄存器低8位
(SP) ←(SP)-2
(4)从栈顶弹出标志寄存器指令 POPF
执行的操作:标志寄存器低8位 ← (SP)
标志寄存器高8位←(SP)+1
(SP)←(SP)+2
PUSHF和P OPF指令用于保护和恢复标志寄存
器内容
48 西华大学电气信息学院
例如: PUSH AX
PUSH CX
PUSHF
. 程序要用到AX,CX以及标志位,
. 执行时可能改变
POPF ;恢复时,后入栈先弹出
POP CX
POP AX
对标志位的影响,除S AHF和P OPF这两 条 指 令
外,其余所有指令均不影响标志位。
49 西华大学电气信息学院
3.4.2 算术运算指令
算术运算指令
算术运算指令涉及 两种类型数据 ,即无
符号数和有符号数。对加法指令和减法指
令而言,无符号和有符号数可采用同一套
指令,其条件有两个:
? 一是参加的操作数必须同为无符号数或同
为有符号数。
? 二是要采用不同标志位来检查无符号数和
有符号数的运算结果是否溢出。
50 西华大学电气信息学院
? 下面看一下两个8位数相加时的4种情况:
①无符号数和有符号数均不溢出
二进制相加 无符号数加 有符号数加
0000 1000 8 +8
+0001 1110 +30 +(+30)
0010 0110 38 +38
结果38 CF=0 OF=0
51 西华大学电气信息学院
② 无符号数溢出
0000 1000 8 +8
+1111 1101 +253 +(-3)
10000 0101 261 +5
结果5 CF=1 OF=0
③ 有符号数溢出
0000 1000 8 +8
+0111 1101 +125 +(+125)
1000 0101 133 +133
结果-123 CF=0 OF=1
(补码表示)
52 西华大学电气信息学院
④ 无符号数和有符号数均溢出
1000 1000 136 -120
+1111 0111 +247 +(-9)
10111 1111 383 -129
结果127 CF=1 OF=1
上面四种情况清楚说明, CF标 志 可用来表示无
符号数的溢出, OF标志可用来表示有符号数的溢
出。
需要指出的是有符号数的溢出是一种 出错 ,在
运算过程中应当避免。
53 西华大学电气信息学院
1. 加法指令
加法指令
共有5条指令:
(1) 不带进位的加法指令ADD.
格式有:ADD ac,data
ADD mem/reg,data
ADD mem/reg1,mem/reg2
例: ADD AL,30H
ADD AX,[BX+20H]
ADD CX,SI
ADD [DI],200H
ADD指令对标志位(指状态标志)都有影响.
54 西华大学电气信息学院
(2) 带进位的加法指令
带进位的加法指令
ADC
ADC指令在形式上和功能上都有与ADD类似,只是
在相加时要把进位标志的现行值CF加到和中, 例如:
ADC AL,68H
ADC AX,CX
ADC BX,[DI]
55 西华大学电气信息学院
ADC指令主要用于多字节加法运算中.
例: 有两个4字节的无符号数相加:
2C56F8AC+309E47BE=?
设被加数、加数分别存放在BUFFER1及BUFFER2
开始的两个存储区内,要求和放回BUFFER1存储区,
如下页图所示。
因CPU只能进行8位或16位的加法运算,为此可将
加法分4次进行.
56 西华大学电气信息学院
56H
2CH
BEH
47H
BUFFER1 ACH
BUFFER2
F8H
9EH
30H
.
.
.
被
加
数
数
据
段
加
数
...
图3-12 多字节加法示意图
57 西华大学电气信息学院
程序段如下:
MOV CX,4 ;置循环次数
MOV SI,0 ;置SI初值为零
CLC ;清进位标志CF
AGAIN:MOV AL,BUFFER2[SI]
ADC BUFFER1[SI],AL ;带进位加
INC SI ;(SI)+1
DEC CX ;(CX)-1
JNZ AGAIN ;若(CX) ≠0,则转AGAIN
INT 20H ;返回DOS
其中: MOV AL,BUFFER2[SI]和
MOV AL,[BUFFER2+SI]等效
思考: 若最高位有进位,如何改?