Upload
amos
View
118
Download
2
Embed Size (px)
DESCRIPTION
第四章 80x86 微处理器的指令系统. 主讲:刘英. 主要内容. 4.1 Intel 80x86 的寻址方式 4.2 Intel 80x86 指令系统. 指令的一般格式. 操作码 操作数. 4.1 Intel 80x86 的寻址方式. 指令:计算机提供给用户的硬件命令 指令系统:所有指令的集合 操作码: 指计算机所要执行的操作,即指出操作类型,是一种助记符。 操作数: 指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数,一个目的操作数。 例: MOV AX , CX ;将 CX 的内容送入 AX 中。 - PowerPoint PPT Presentation
Citation preview
第四章 80x86 微处理器的指令系统
主讲:刘英
主要内容
4.1 Intel 80x86 的寻址方式 4.2 Intel 80x86 指令系统
4.1 Intel 80x86 的寻址方式 指令:计算机提供给用户的硬件命令 指令系统:所有指令的集合
操作码:指计算机所要执行的操作,即指出操作类型,是一种助记符。
操作数:指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数,一个目的操作数。
例: MOV AX , CX ;将 CX 的内容送入 AX 中。 寻址方式:就是指令中用于说明操作数所在地址的方法,或
者说是寻找操作数有效地址的方法。
操作码 操作数
指令的一般格式
4.1 Intel 80x86 的寻址方式
计算机中操作数按存放的方法分为: 立即数(指令中) 寄存器数 存储器数 I/O 端口
操作数 寻址方式立即数 立即数寻址
寄存器数 寄存器寻址
端口寻址 直接寻址寄存器间接寻址
串操作寻址
存储器数
寄存器间接寻址寄存器相对寻址
相对基址变址寻址基址变址寻址
直接寻址
4.1.1 立即寻址
操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。
12H
34H
操作码AX
AH AL
12H 34H
存储器
代码段
例如: MOV AX , 1234H
4.1.1 立即寻址
立即操作数可以是 8 位或 16 位,并且是指令的一部分。立即数据总是紧跟在指令操作码之后并和操作码一起存放在代码段中,因而立即数据总是和操作码一起被放入 BIU 中的指令队列里,在指令执行时不需再存取存储器。 MOV AH, 80H ADD AX, 1234H
在汇编语言中,规定:立即数不能作为指令中的第一操作数。该规定与高级语言中“赋值语句的左边不能是常量”的规定相一致。
使用立即寻址的指令主要用来给寄存器赋初值。
4.1.2 寄存器寻址
操作数包含在 CPU 的内部寄存器中,如寄存器 AX 、BX 、 CX 、 DX 等,指令指定寄存器号。
BH BL
23H 45H AX
例如: MOV AX , BX
4.1.2 寄存器寻址
对于 16 位操作数,寄存器可以是 AX , BX , CX , DX ,SI , DI , SP 或 BP ;
而对 8 位操作数,寄存器可以是 AH , AL , BH , BL ,CH , CL , DH 或 DL 。
MOV AX, BX MOV CL, DL INC CX ROL AH, 1
特点: 操作数在 CPU 内,不用通过总线读写,速度快; 目的和源操作数均可采用此寻址方式,但必须使用同样字长的寄存器。
4.1.3 直接寻址
操作数的有效地址 (Effective Address, EA 。在 IBM PC 中把操作数的偏移地址称为有效地址 ) 是指令的一部分,它与操作码一起存放在代码段中,但操作数一般是在数据段中,因而这种寻址方式是以 DS 的内容为基准。可使用段超越前缀来改变数据所在段地址。
A1H00H30H
....
....
代码段
例如: MOV AX , [3000H]假设 (DS) =1000HPA=1000H 10H+3000H = 13000H
数据段13000H13001H
AX
AH AL
34H 12H
12H34H
4.1.3 直接寻址
举例: MOV AL,[2000H]; 将 DS*10H+2000H 单元的内容送 AL ;
MOV AX,[2000H]; 将 DS*10H+2000H 单元的内容送 AL , DS*10H+2000H+1 单元的内容送 AH ;
MOV AL,ES:[2000H]; 这里 ES 是段超越 前缀,所以源操作数是在 ES*10H+2000H 的内存单元中。
MOV [3000H],AL; 目的操作数采用直接寻址,将 AL 送 DS*10H+3000H 的内存单元。
适于处理单个变量
4.1.4 寄存器间接寻址
操作数的有效地址 EA 存放在基址寄存器 (BX 或 BP) 或变址寄存器 (DI 或 SI) 中。
隐含段地址: SI 、 DI 、 BX 为 DS ; BP 为 SS 。可用段跨越。 BX , SI , DI 操作数在数据段 (DS)
物理地址 = (DS) 10H +
BP 操作数在堆栈段 (SS) 物理地址 = (SS) 10H + (BP)
(BX)
(SI)
(DI)
4.1.4 寄存器间接寻址
例如: MOV AX , [SI]假设 (DS) =3000H , (SI) =1000HPA=3000H 10H+1000H = 31000H 操作码
....
....
代码段
数据段31000H31001H
AX
AH AL
35H 12H
12H
35H
4.1.4 寄存器间接寻址
举例 MOV AL,[BX]; [DS*10H+BX] 送 AL 设 DS=3000H , BX=2000H , (32000H)=45H ,则执行该指令后,
AL=45H 。
MOV AL,[BP]; [SS*10H+BP] 送 AL 设 DS=2000H , SS=1000H , BP=0100H , (10100H)=3BH , (201
00H)=4CH 。执行这条指令后, AL=3BH 。
MOV AX,[BX]; [DS*10H+BX] 送 AL , [DS*10H+BX+1] 送 AH
常用于访问存储器中的一维数组或表格。
4.1.5 寄存器相对寻址(变址寻址)
操作数的有效地址 EA 是 8 位或 16 位的位移量与基址寄存器 BX 或基址指示器 BP 或某个变址寄存器(DI 或 SI) 之和。
隐含段地址: SI 、 DI 、 BX 为 DS ; BP 为 SS 。可用段跨越。
有效地址 EA=
(BX)
(BP)
(SI)
(DI)
+8 位
16位
位移量
4.1.5 寄存器相对寻址(变址寻址)
例如: MOV AX , DATA[BX]假设 (DS)=4000H , (BX)=2000H , DATA=0020HPA=4000H 10H+2000H+0020H = 42020H
数据段42020H42021H
AX
AH AL
86H 12H
12H
86H
操作码20H
00H
....
....
代码段
4.1.5 寄存器相对寻址(变址寻址)
举例 MOV AL,5[BX] MOV AL,[BX+5]
COUNT EQU 5 MOV AL,COUNT[BX]
以上三个例子是等价的,它执行的操作是: [DS*10H+BX+5] 送 AL 。这里, 5 称为位移量( displacement ),它可以是 8 位或 16 位的二进制数。
适用于数组和表格处理,首地址存放在位移变量中,修改寄存器的值以访问数组中的各个元素。
4.1.6 基址变址寻址 有效地址 EA 是由基址寄存器 BX( 或基址指示器 BP) 的内容
与变址寄存器 (DI 或 SI) 的内容之和。
注意:必须是一个基址寄存器和一个变址寄存器的组合,不可同为基址寄存器( BX 、 BP )或同为变址寄存器( SI 、DI )。
同样适用于数组和表格处理。
有效地址 EA=(BX)
(BP)+
(SI)
(DI)基址 变址
例如: MOV AX , [BX][DI]假设 (DS)=4000H , (BX)=2000H , (DI)=2000 ,PA=4000H 10H+2000H+2000H+0100H = 44100H
4.1.7 相对基址变址寻址 操作数 EA 的有效地址是一个基址寄存器和一个变址寄存器
的内容和 8 位或 16 位位移量之和。
常用于对二维数组的寻址,例如,存储器中存放多个记录组成的文件,则位移量指向文件的首地址,基址寄存器指向某个记录,变址寄存器指向该记录中的一个元素。
有效地址 EA=
(BX)
(BP)+
(SI)
(DI)+
8 位
16 位位移量
例如: MOV AX , [BX][SI]DATAMOV AX , [BX+SI] DATAMOV AX , [BX+SI+DATA]
假设 (DS)=4000H , (BX)=2000H , (SI)=2000 , DATA=0100HPA=4000H 10H+2000H+2000H+0100H = 44100H
4.1.7 相对基址变址寻址
正常来源 其他来源 偏移地址取 指 令 CS 无 IP
堆 栈 操 作 SS 无 SP
串 操 作 源 地 址 DS CS、SS、ES SI
串操作目的地址 ES 无 DI
用BP 间 接 寻 址 SS CS、SS、ES 有效地址EA
一 般 数 据 存 取 DS CS、SS、ES 有效地址EA
操作类型段基址
段寄存器使用的基本约定
4.2 Intel 80x86 指令系统
8086/8088 指令系统共包含 92 种基本指令 8086 指令按照功能分为 6 大类:
数据传送指令 14 条 算术运算指令 20 条 逻辑运算和移位指令 13 条 串操作指令 13 条 控制转移指令 28 条 处理器控制指令 12 条
4.2.1 数据传输指令
指令类型
指令格式 指令功能 状态标志位 备注
O S Z A P C
通用数据传送
MOV 目标,源PUSH 源POP 目标XCHG 目标,源XLAT
字节或字传送字压入堆栈字弹出堆栈字节或字交换AL 中数据转换
- -- - --- -- - --- -- - --- -- - -- - -- - --
源: R 、 M 、立即数 目标: R 、 M
源: R 、 M
目标: R ( CS 除外 ) 、 M
源:通用 R 、 M 目标:通用 R 、 M
目标地址传送
LEA 目标,源LDS 目标,源LES 目标,源
装入有效地址装入数据段指针到 DS
装入附加段指针到 ES
- -- - --- -- - --- -- - --
源:内存操作数 目标: 16 位通用 R
源:内存操作数 目标: 16 位通用 R
源:内存操作数 目标: 16 位通用 R
标志位传送
LAHF
SAHF
PUSHF
POPF
把 FR 低字节装入 AH
把 AH 内容装入 FR 低字节把 FR 内容压入堆栈从堆栈中弹出 FR 内容
- -- - --- · · · · ·
- -- - -- · · · · · ·
I/O 数据传送
IN 累加器 , 端口OUT 端口 , 累加器
输入字节或字输出字节或字
- -- - --- -- - --
累加器: AL 或 AX
端口:地址 0 ~ 255 或间址寄存器 DX
说明: · 表示运算结果影响标志位, - 表示运算结果不影响标志位。
4.2.1 数据传输指令
(一)通用数据传送指令 通用数据传送指令包括
1. 传送指令 MOV 2. 数据交换指令 XCHG 3.查表转换指令 XLAT 4. 堆栈操作指令 PUSH 和 POP
4.2.1 数据传输指令
1.最基本的传送指令 MOV MOV 指令是形式最简单、用得最多的指令。它可
以实现 CPU 内部寄存器之间的数据传送、寄存器和内存之间的数据传送,还可以把一个立即数送给 CPU 的内部寄存器或内存单元。
语句格式: MOV OPRD1 , OPRD2 功能:将源操作数传送入目的地址,源地址内容不
变。即( OPRD1 )( OPRD2 )。 其中: OPRD1 可以是通用寄存器、段寄存器、存储器操
作数; OPRD2 可以是通用寄存器、段寄存器、存储器操作数、立即数。
4.2.1 数据传输指令
例如: MOV AL , BL MOV ES , DX MOV AX , [BX] MOV [DI] , AX MOV CX , [1000] MOV BL , 40 MOV DX , 5040 MOV WORD PTR[SI] , 6070
4.2.1 数据传输指令
注意: 一般 CS 和 IP 的内容不通过 MOV 指令进行修改,它们只能作为源操作数;
两个存储器操作数之间不允许直接进行信息传送,但可以用 CPU 内部寄存器为桥梁来完成这样的传送;如:
MOV AX , [SI] ;MOV [BX] , AX ;
两个段寄存器之间不能直接传送 信息,也不允许用立即寻址方式为段寄存器赋初值;如:
MOV AX , 0MOV DS , AX
目的操作数,不能用立即寻址方式; OPRD1 与 OPRD2 必须类型匹配,即同时是字节或字类
型。
4.2.1 数据传输指令
例:错误的 MOV 指令如下所示: MOV AX , BL MOV DS , 1000H MOV [BX] , [SI] MOV ES , CS MOV CS , AX
例:设 B 是已定义的字节变量,判断指令的正确性。 MOV AX , B MOV AL , 0
;类型不匹配;不允许立即数送段寄存器;不允许内存操作数之间传送;不允许段寄存器之间传送; CS不能作为目的操作数
;错误,类型不匹配;正确,MASM可以判断出要送字节 0
4.2.1 数据传输指令 2. 堆栈操作指令 堆栈概念:存储器的一段区域,按“先进后出”的原则进行存
出操作。 8086/8088 系统,堆栈位于堆栈段, 其段地址由 SS 指示, SP 寄存器作为指针, SP 内容始终指向栈顶所在存储单元。
作用:在调用一个过程时,保存返回地址;暂时存放寄存器或存储器单元操作数的内容
语句格式: 进栈: PUSH OPRD 操作:( SP )( SP ) -2 ;(( SP ) +1 ,( SP ))( OPRD ) 出栈: POP OPRD 操作:( OPRD )(( SP ) +1 ,( SP ));( SP )( SP ) +2
注意: 以上两个指令只能对字操作 不能 POP CS
4.2.1 数据传输指令
例如:将 16 位通用寄存器 CX 的内容压入堆栈,然后,弹出栈顶至 CX 中
已知: (SS) = 0200H , (SP) = 0008H , (CX) = 12FAH
4.2.1 数据传输指令
8086/8088 系统的堆栈具有如下特点: 堆栈是在内存的堆栈段中, 具有“先进后出”的特点; 堆栈只有一个出入口,即当前栈顶为空时,栈顶和栈底指
向同一内存单元; 堆栈有两个基本操作: PUSH (进栈)和 POP (出栈)。
PUSH 操作使栈顶向低地址方向移动,而 POP 操作则刚好相反;
堆栈操作只能作字操作; SS : SP 在任何时候都指向当前的栈顶。
4.2.1 数据传输指令 3.交换指令 交换指令 XCHG 可以实现字节交换,也可以实现字交换。 语句格式: XCHG OPRD1 , OPRD2 功能:将源操作数与目的操作数的内容互换 注意:
源操作数和目的操作数可以是寄存器或存储器,但不能同时为存储器; 段寄存器和立即数不能作为操作数; 两个操作数字长必须相同。
例如: XCHG AL , BL ; AL 和 BL 之间进行字节交换
XCHG BX , CX ; BX 和 CX 之间进行字交换 XCHG [2530] , CX ; CX 中的内容和 2530 , 2531 两单元的内
容交换
4.2.1 数据传输指令
4.查表指令 XLAT 是一条完成字节翻译功能的指令,它可以使累加器中
的一个值变换为内存表格中的某一个值,一般用来实现编码制的转换。
语句格式语句格式: XLAT 功能:功能:将( BX )为首地址( AL )为位移量的字节存储单
元中的数据送 AL 寄存器。即( [BX+AL] )→ AL 。 使用换码指令时,要求 BX 寄存器指向表的首地址, AL 的
内容为表中某一项与表格首地址之间的偏移量,指令执行时,会将 BX 和 AL 中的值相加,把得到的值作为地址,然后将此地址所对应的单元中的值取到 AL 中去。
4.2.1 数据传输指令
下图表示了换码指令的功能。 XLAT 指令就是通过查表方式来完成翻译功能的,因此,在执行该指令之前,必须建立好一张翻译表,该表的最大容量为 256 字节。
4.2.1 数据传输指令 (二)地址传送指令 这是一类专用于传送地址码的指令,可用来传送操作数的段地址
或偏移地址,共包含以下 3 条指令: LEA 、 LDS 、 LES 1. 取有效地址指令 语句格式: LEA OPRD1 , OPRD2 功能:把源操作数 OPRD2 的地址偏移量传送至目的操作数 OPR
D1 。 注意: LEA 指令格式中,要求源操作数必须为内存单元地址,
目的操作数必须为一个 16 位的通用寄存器。这条指令通常用来建立串操作指令所须的寄存器指针。
例如: LEA AX ,[ 2728];将 2728 单元的偏移量送 AX ,指令执行后, A
X 中为 2728 LEA BX ,[ BP+SI] ;指令执行后, BX 中的内容为 BP+SI
的值 LEA SP ,[ 0482] ;使堆栈指针 SP 为 482
问题: LEA指令与MOV指令有何区别?
4.2.1 数据传输指令
LEA 指令与 MOV 指令的区别: LEA SI , BUFF ;指令是将标号 BUFF 的偏移地址送入
寄存器中; MOV SI , BUFF ;指令是将标号 BUFF 所指存储单元的
内容送入 SI 。
BUFF =
0
1
2
3
4
5
48
00
FF
FF
LEA SI , BUFF ;
执行后:( SI ) =0002H
段起 始地址
MOV SI , BUFF ;
执行后:( SI ) =0048H
4.2.1 数据传输指令
2. 将地址指针装到 DS 和另一个寄存器的指令 语句格式: LDS OPRD1 , OPRD2 功能: LDS 指令的功能是把 4 个字节的地址指针(其中包括一个段地址和一个偏移量)传送 到两个目的寄存器,其中,地址指针的后两个字节即段地址一定送 到 DS 中。
例如: LDS SI , [2480] 已知: (DS)=C000H , (C2480H)=1357H , (C2482H)=2468
H
57H
13H
68H
24H
DS :2480HDS :2481HDS :2482HDS :2483H
13 57
SI
24 68
DS
4.2.1 数据传输指令
3. 将地址指针装到 ES 和另一个寄存器的指令 语句格式: LES OPRD1 , OPRD2 功能: LES 指令与 LDS 指令的操作基本相同,所不同仅在
于将源操作数所指向地址指针中的段基址 ( 后两个字节 ) 传送到 ES 段寄存器,而不是 DS 段寄存器。
例如: LES BX,TABLE[SI]
4.2.1 数据传输指令 (三)标志传送指令 1. 读取标志指令 语句格式: LAHF 功能:将标志寄存器的低 8 位送入 AH 寄存器。
2. 设置标志指令 SAHF 语句格式: SAHF 功能:将 AH 的内容送入标志寄存器的低 8 位,高 8 位不变。从该指令功能可看出, SAHF 为 LAHF 的逆过程。
注意:该指令影响标志位 S 、 Z 、 A 、 P 、 C
4.2.1 数据传输指令
3. 对标志寄存器的压入堆栈指令和弹出堆栈指令 PUSHF 指令将标志寄存器的值压入堆栈顶部,同时,堆栈
指针 SP 的值减 2 ,此指令在执行时标志寄存器的值不变。 POPF 指令的功能正好相反,此指令在执行时从堆栈中弹出
一个字送到标志寄存器中,同时堆栈指针 SP 的值加 2 。该指令影响标志位 O 、 S 、 Z 、 A 、 P 、 C
PUSHF 和 POPF 指令一般用在子程序和中断处理程序的首尾,起保存主程序标志和恢复主程序标志的作用。
4.2.1 数据传输指令
(四)输入 / 输出指令 1.输入指令 IN 语句格式:
IN AL , PORT ; AL←[PORT] IN AX , PORT ; AX←[PORT+1][PORT] IN AL , DX ; AL←[DX] IN AX , DX ; AX←[DX+1][DX] PORT指端口号,即端口寄存器地址。
功能:从 I/O 端口输入数据至 AL 或 AX 。 注意:输入指令允许把一个字节或一个字由一个输入端口传送到 AL 或 AX 中。若端口地址超过 255 时,则必须用 DX保存端口地址,这样用 DX 作端口寻址最多可寻找 64K 个端口。
4.2.1 数据传输指令
2. 输出指令 语句格式:
OUT PORT , AL ; AL→ [PORT] OUT PORT , AX ; AX→ [PORT+1][PORT] OUT DX , AL ; AL→ [DX] OUT DX , AX ; AX→ [DX+1][DX]
功能:将 AL 或 AX 的内容输出至 I/O 端口。 注意:该指令将 AL 或 AX 中的内容传送到一个输出端口。
端口寻址方式与 IN 指令相同。
4.2.1 数据传输指令 例如:
直接 IN 指令(口地址只能 8 位)IN AL , 50HIN AX , 80H
间接 IN 指令(口地址是 16 位,也可 8 位)MOV DX , 0FFF2HIN AL , DX
直接 OUT 指令(口地址只能 8 位)OUT 44H , ALOUT 70H , AX
间接 OUT 指令(口地址是 16 位,也可 8 位)MOV DX , 87FEHMOV AL , 40H OUT DX , AL
课堂习题及答案
比较下列两条指令 ,指出它们的区别假设 AX=0002H, DS=2000H, SI=1000H, (21000)=0036HMOV AX,[SI] ;将内存单元 DS:[SI]中的内容读到寄存器 AX中执行后 AX=(21000H)=0036H MOV [SI],AX ;将寄存器 AX中的内容写入内存单元 DS:[SI]执行后 (21000H)=0002H
MOV AX,[SI] ;将内存单元 DS:[SI]中的内容读到寄存器 AX中执行后 AX=(21000H)=0036H LEA AX,[SI] ;将内存单元 DS:[SI]的偏移地址送到 AX执行后 AX=1000H