1.95k likes | 2.26k Views
第 8 章 寻址方式与指令系统. 8.1 8086/8088 的寻址方式与指令系统. 8.1.1 8086/8088 的寻址方式 1. 寻址方式概述. 寻址方式. 定义 : 指令中如何提供操作数或操作数地址的方式称为寻址方式。 [ 规定如何对地址字段作出解释以找到操作数 ] * 程序转移时需提供转移地址,这跟提供操作数地址在方法上没有本质区别,因此也归入寻址方式的范畴。. 一个指令系统能够提供哪些寻址方式,能否为编制程序提供方便,这是指令系统设计的关键。
E N D
8.1 8086/8088的寻址方式与指令系统 8.1.1 8086/8088 的寻址方式 1. 寻址方式概述
寻址方式 • 定义 :指令中如何提供操作数或操作数地址的方式称为寻址方式。 [规定如何对地址字段作出解释以找到操作数] *程序转移时需提供转移地址,这跟提供操作数地址在方法上没有本质区别,因此也归入寻址方式的范畴。
一个指令系统能够提供哪些寻址方式,能否为编制程序提供方便,这是指令系统设计的关键。一个指令系统能够提供哪些寻址方式,能否为编制程序提供方便,这是指令系统设计的关键。 • 需要说明的是,在不同的计算机系统中,寻址方式的名称和分类并不统一,但基本可以归结为以下几种方式或它们的变型或组合:
立即寻址(立即数寻址) 寄存器寻址 直接寻址 间接寻址 变址寻址 例如,Z80系统: 立即寻址 ;直接寻址 立即扩展寻址;零页寻址 隐含寻址;相对寻址 寄存器寻址;变址寻址 寄存器间接寻址;位寻址 寻址方式的名称和分类
两类寻址方式 • 数据的寻址方式 • 转移地址的寻址方式 • (我们重点讨论数据的寻址方式) 2. 数据的寻址方式
(1) 立即寻址(Immediate addressing) • 指令中直接给出操作数,操作数紧跟在操作码之后,作为指令的一部分存放在代码段里,在取出指令的同时也就取出了操作数,立即有操作数可用,所以称之为立即寻址。
目的源example MOV AL, 80H ; 低地址存储器 AX MOV AX, 3064H ;代 码 ADD AL, 20H ;段 ADD AX, 1090H;高地址
立即数可以为8位,也可以为16位。如果是16位数,则“高位字节存放在高地址中,低位字节存放在低地址中。”立即数可以为8位,也可以为16位。如果是16位数,则“高位字节存放在高地址中,低位字节存放在低地址中。” 立即寻址方式常用于给寄存器赋值,并且只能用于源操作数,而不能用于目的操作数。
下述各条指令源操作数的寻址方式也都是立即寻址,但这些指令都是错误的: MOV AL, 256 ; 256=100H,超过了AL能存放的数的范围 MOV AX, -32769 ; -32769超过了AX能存放的带符号数(补码)范围 MOV 100H, AL ; 立即数不能作为目的操作数 DEC 20 ; 单操作数指令不能使用立即数 MOV DS, 1234H; 源操作数是立即数,则目的操作数就不能是段寄存器
(2) 寄存器寻址(Register addressing) • 操作数在寄存器中,指令中指明寄存器号,这种寻址方式叫寄存器寻址。 • 对于8位操作数,寄存器可以是 AH, AL,BH,BL, CH, CL, DH, DL . • 对于16位操作数,寄存器可以是AX, BX,CX, DX, SI, DI, SP ,BP,CS,DS,ES,SS(但CS 不能作目的寄存器)
EXAMPLE • INC AX ; MOV AX, BX ; DEC AX ; ROL AH , 1 ; 将AH中的内容循环左移一位
练习: • MOV AX , BX ;正确。指令执行后,AX←BX,但BX不变 MOV AX, BL ;错误。源和目的的位数不相同 MOV CS, AX ;错误。CS不能作为目的操作数 MOV ES, DS ;错误。两个操作数不能都是段寄存器
寄存器寻址的特点 (1) 操作数就在寄存器中,不需要访问存储器来取得操作数(指令执行时,操作就在CPU的内部进行),因而执行速度快。 (2)寄存器号比内存地址短 * 在编程中,如有可能,尽量使用这种寻址方式的指令。 * 寄存器寻址方式既可用于源操作数,也可用于目的操作数,还可以两者都用于寄存器寻址方式(如 MOV BX , AX )
除以上两种寻址方式外,下面各种寻址方式的操作数均在存储器中,通过采用不同的寻址方式取得操作数地址,从而取得操作数。除以上两种寻址方式外,下面各种寻址方式的操作数均在存储器中,通过采用不同的寻址方式取得操作数地址,从而取得操作数。
(3)直接寻址(Direct Addressing) • 说明:在讨论寻址方式时,通常把操作数的偏移地址称为有效地址EA(Effective Address) ,EA可通过不同的寻址方式来得到。 • 在直接寻址方式中,指令中直接给出操作数的有效地址,或者说,有效地址EA就在指令中。它(操作数的有效地址,而不是操作数本身)存放在代码段中指令的操作码之后,但操作数一般存放在数据段中。
例 1. MOV AX , DS:[2000H]; 如(DS)= 3000H, 则指令的执行情况如下图所示:
代 存储器采用直接寻址方式,如果没 码 有用“段跨越前缀”标明操作 段 数在哪一段,就默认段寄存 为DS. 30000H 数 AX 据 段 32000H 执行结果:(AX)=3050H
当然, 也允许数据存放在数据段以外的其它段(如附加段)。此时应在指令中给出 “跨越段前缀”。 • 例 2:如数据在附加段中,则应指明“段跨越缀” 。 MOV AX , ES : [3000H] 或 ES: MOV AX , [3000H] * 为了使指令字不要过长,规定双操作数指令不能两个操作数都用直接寻址方式。 如 MOV DS: [2000H] , DS:[3000H]
(4) 寄存器间接寻址(Register indirect Addressing) • 采用寄存器间接寻址方式时,指令中给 出寄存器号(寄存器为BX,BP,SI和DI之一), 被指定的寄存器中存放着操作数的有效地址,操作数在存储器中(以寄存器的内容为操作数的有效地址)。 [BX]……..对应段寄存器为 DS EA= [BP]…….. ………………… SS [SI]……… …………………..DS [DI]……… ………………….DS
Example • MOV AX , [BX] ; 设 ( DS) = 2000H ,(BX) = 1000H 物理地址=20000H + 1000H =21000H *指令中也可以通过 AX ………. “段跨越前缀”取得 数 其他段中的数据, 据 例如: 段MOV AX,ES: [BX] 21000H 指令的执行结果为: (AX) = 50A0H
(5) 寄存器相对寻址(Register relative addressing) • 操作数的有效地址是一个基址或变址寄存器的内容与指令中指定的8位或16位位移量(Displacement)之和。 • 如下图所示:
[BX] 8位位移量 EA = [BP] + [SI] 16位位移量 [DI] 若没有段跨越前缀,则对于寄存器BX,SI, DI的情况,段寄存器为DS; 对于寄存器为BP的情况,则段寄存器为SS.
Example MOV AX, [SI+3000H] 操 设(DS)=4000H,(SI)=2000H 作 物理地址码=40000H+2000H+3000H 位 = 45000H 移 指令的执行情况如 量 右图 AX 40000H 43000H SI 数 45000H据 段
这种寻址方式可用于表格的处理,通过位移量来设置表格的首地址;这种寻址方式可用于表格的处理,通过位移量来设置表格的首地址; • 利用修改基址寄存器或变址寄存器的内容来获得表项的值。
(6)基址变址寻址(Based indexed addressing) • 操作数的有效地址是一个基址寄存器和一个变址寄存器内容之和,两个寄存器均由指令指定。 [BX] [SI]若基址寄存器为BX,则段寄存器为DS EA= + [BP] [DI] 若基址寄存器为BP,则段寄存器为SS
Example 例:MOV AX,[BX+DI] 设(DS)=2100H, (BX)=0158H, [DI]=10A5H. 则 EA= 0158H+10A5H=11FDH 物理地址=21000H+11FDH=221FDH [BX] 21000H 21158H AX 221FDH
这种寻址方式同样适用于表格(或数组)的处理,表的首地址可存放在基址寄存器中,而用变址寄存器来访问表格中的各项。这种寻址方式同样适用于表格(或数组)的处理,表的首地址可存放在基址寄存器中,而用变址寄存器来访问表格中的各项。 • 由于两个寄存器都可以修改,使 用起来更灵活。
(7 )相对基址加变址寻址(Relative based indexed address~) • 也称“带位移量的基址加变址寻址方式”. 操作数的有效地址是一个基址寄存器和一个变址寄存器内容与8位或16位位移量之和。 [BX] [SI] 用BX,则段寄存器为 DS EA= + + 位移量 [BP] [DI] 用BP,则段寄存器为SS
例:MOV AX,[BX+SI+0250H] 设(DS)=3000H,(BX)=2000H,(SI)=1000H,则 代 EA= 2000H+1000H+0250H=3250H 码 物理地址=30000H+3250H=33250H 段 30000H 位移量 AX 30250H 数 (BX) 32250H 据 (SI) 33250H段
这种寻址方式可用于访问二维数组。 • 设数组元素在内存中按行顺序存放(首先放第一行所有元素,再放第二行所有元素,……)。通过改变基址寄存器(如BX)和变址寄存器(如SI)的值可以访问数组中不同行和列上的元素。 • 如,若保持BX不变而SI改变,则可以访问同一行的所有元素。 • 若保持SI不变而BX改变,则可以访问同一列的所有元素。
数据的寻址方式的寻址过程(图示) . 指令 指令 寄存器 数据 寄存器 数据 (2)寄存器寻址 (1)立即寻址 图8.1 数据的寻址方式的寻址过程(1)
存储器 指令 EA 数据 (3)直接寻址 指令 寄存器 存储器 寄存器 EA 数据 (4)寄存器间接寻址 图8.1 数据的寻址方式的寻址过程(2)
指令 寄存器 位移量 存储器 EA + 数据 寄存器 地址 (5)寄存器相对寻址 图8.1 数据的寻址方式的寻址过程(3)
寄存器 指令 基址 寄存器 变址 寄存器 变址值 存储器 EA 数据 + 寄存器 基地址 (6)基址变址寻址 图8.1 数据的寻址方式的寻址过程(4)
指令 基址 寄存器 变址 寄存器 位移量 存储器 寄存器 EA + 数据 变址值 寄存器 基地址 (7)基址变址相对寻址 图8.1 数据的寻址方式的寻址过程(5)
端 口 操 作 数 指令 端口 端口号 数据 (8)直接寻址 指令 DX 端口 DX 端口号 数据 (9)间接寻址 图8.1 数据的寻址方式的寻址过程(6)
3. 转移地址的寻址方式(*) • 有关术语和概念: • 段内转移—如果转移地址与该转移类指令在同一个代码段,这样的转移称为段内转移,也称近转移; • 近转移时的转移地址只包含偏移地址部分,找到转移地址后,将转移地址送入IP即可实现转移(CS的内容不必改变)。
段间转移—如果转移地址与该转移类指令位于不同的代码段,这样的转移称为段间转移,也称远转移;段间转移—如果转移地址与该转移类指令位于不同的代码段,这样的转移称为段间转移,也称远转移; • 远转移时的转移地址既包含偏移地址部分又包含段基值部分,找到转移地址后,将转移地址的段基值部分送入CS,将转移地址的偏移地址部分送入IP即可实现转移。
直接转移—如果转移地址直接放在指令中,则这样的转移称为直接转移,视转移地址是绝对地址还是相对地址(即地址位移量)又可分别称为绝对转移和相对转移。直接转移—如果转移地址直接放在指令中,则这样的转移称为直接转移,视转移地址是绝对地址还是相对地址(即地址位移量)又可分别称为绝对转移和相对转移。 • 间接转移—如果转移地址间接放在其他地方,则这样的转移称为间接转移,视转移地址是在寄存器中还是在存储器中又可分别称为寄存器操作数(寄存器寻址)和存储器操作数(存储器寻址)。
以JMP指令为例,可将转移地址的各种寻址方式列出,如表8-2所示。以JMP指令为例,可将转移地址的各种寻址方式列出,如表8-2所示。
(1) 段内直接转移(直接近转移) 特点: • 转移地址(通常就是近标号)直接包含在汇编形式的转移指令中,转移指令的机器代码中存放的是该标号与当前IP值的差(标号-IP),此差称为位移量,该位移量与转移指令一起存于代码段: 位移量被放在转移指令的操作码之后,也是“高字节放在高地址单元,低字节放在低地址单元”。 • 在取转移指令时,此位移量即作为转移指令的一部分被取入CPU中。
执行转移指令时,将这个位移量加到IP上即可得到转移地址(标号的值),即执行转移指令时,将这个位移量加到IP上即可得到转移地址(标号的值),即 IP+(标号-IP)=标号=转移地址 • 而不必为找这个转移地址再去访问寄存器或存储器。 • 例如,如果L是本段中的标号,则下述指令采用的是段内直接转移方式: • JMP L;机器指令中的位移量为L-IP,转移地址为L
(2) 段内间接转移(间接近转移) ① 寄存器操作数(也称寄存器寻址) 例:JMP BX ; BX的内容为转移地址 ② 存储器操作数(也称存储器寻址) • (i) 直接寻址 • 其特征是: 转移地址(偏移地址部分)在数据存储单元中,数据存储单元的地址在指令中直接给出。 • 例如,JMP WORD PTR DS:[20];数据存储单元(DS:20)的一个字为转移地址
(ii) 寄存器间接寻址 • 其特征是: 转移地址(偏移地址部分)在数据存储单元中,数据存储单元的偏移地址在BX、BP、SI、DI之一中。 • 例如,下述指令采用的就是段内间接转移、寄存器间接寻址方式: • JMP[BX];数据存储单元(DS:BX)的一个字为转移地址 • JMP[BP];数据存储单元(SS:BP)的一个字为转移地址 • JMP DS:[BP];数据存储单元(DS:BP)的一个字为转移地址
(iii) 寄存器相对寻址 其特征是: 转移地址(偏移地址部分)在数据存储单元中,数据存单元的偏移地址是寄存器(BX、BP、SI、DI之一)的内容与位移量的和。 • 例如,下述指令采用的就是段内间接转移、寄存器相对寻址方式: • JMP[BX+20] ;数据存储单元(DS:BX+20)的一个字为转移地址 JMP[BP+20] ;数据存储单元(SS:BP+20)的一个字为转移地址 • JMP DS:[BP+20 ] ;数据存储单元(DS:BP+20)的一个字为转移地址
(iv) 基址变址寻址 • 其特征是: 转移地址(偏移地址部分)在数据存储单元中,数据存储单元的偏移地址是基址寄存器(BX、BP之一)的内容和变址寄存器(SI、DI之一)的内容之和。 • 例如,下述指令采用的就是段内间接转移、基址变址寻址方式: • JMP[BX+SI] ;数据存储单元(DS:BX+SI)的一个字为转移地址 • JMP[BP+SI] ;数据存储单元(SS:BP+SI)的一个字为转移地址 • JMP DS:[BP+SI ] ;数据存储单元(DS:BP+SI)的一个字为转移地址
(v) 基址变址相对寻址 • 其特征是: 转移地址(偏移地址部分)在数据存储单元中,数据存储单元的偏移地址是基址寄存器(BX、BP之一)的内容、变址寄存器(SI、DI之一)的内容及位移量的和。 • 例如,下述指令采用的就是段内间接转移、寄存器间接寻址方式: • JMP[BX+SI+20] ;数据存储单元(DS:BX+SI+20)的一个字为转移地址 • JMP[BP+SI+20] ;数据存储单元(SS:BP+SI+20)的一个字为转移地址 • JMP DS:[BP+SI+20 ] ;数据存储单元(DS:BP+SI+20)的一个字为转移地址
(3) 段间直接转移(直接远转移) • 转移地址(通常就是远标号)直接包含在汇编形式的转移类指令中,也直接存放在转移类指令的机器代码中,它是转移类指令不可分割的一部分,位于转移类指令的操作码之后: • 高字存放转移地址的段基值部分,低字存放转移地址的偏移地址部分。在取转移类指令时,此段基值和偏移地址作为转移类指令的一部分被取入CPU中,执行转移类指令时,不必为找转移地址再去访问寄存器或存储器。