You are on page 1of 58

寻址方式

本章结构

2.1 操作数类型
2.2 有效地址和段超越
2.3 与数据有关的寻址方式
2.4 与转移地址有关的寻址方式
2.5 寻址方式总结
2.1 操作数类型

2.1.1 立即数

2.1.2 寄存器操作数

2.1.3 存储器操作数
2.1 操作数类型

指令格式:操作码 操作数 1, 操作数 2 ;注释

 每种计算机提供给用户使用一组指令集及其相关语法
规则称为该计算机的指令系统。
 一条指令提供的信息:完成什么操作、操作数或操作数
地址是什么。
 操作码域 : 指定要完成的操作。
2.1 操作数类型

 操作数 2 :源操作数,表示参与指令操作的一个对象;
 操作数 1 :目的操作数,它不仅可以作为指令操作的一
个对象,还可以用来存放指令操作的结果。
 分号后的内容是对指令的解释。
例: MOV AH , 10 ; ( AH )= 10
2.1 操作数类型

零操作数 单操作数 双操作数


(地址)指令 (地址)指令 (地址)指令

指令本身无需 指令中只有目 指令中指出参


任何操作数或 的操作数或者 加操作的 2 个
者所需操作数 隐含约定目的 操作数的地址,
隐含约定的操 操作数; 操作后结果存
入目标操作数
作数; 例: INC 中。
例: CX 、 PUSH 例: MOV AX ,
NOP 、 HLT AX [2000H] LOGO
www.1ppt.com
2.1 操作数类型

2.1.1 立即数

8086 的机器代码( Machine Code )格式


2.1 操作数类型

2.1.1 立即数

 操作码占 1 个或 2 个字节
 后面的各个字节指明操作数:
“mod reg r/m” 字节表明采用的寻址方式,
“ 位移量”字节给出某些寻址方式需要的对
基地址的偏移量,
“ 立即数”字节给出立即寻址方式需要的数
值本身。
2.1 操作数类型
2.1.2 寄存器操作数

操作数的各个字段有多种组合,如表 1 所示

 mem—— 代表 m8 或 m16
 r8—— 任意一个 8 位通用寄存器
i8—— 一个 8 位立即数
r16—— 任意一个 16 位通用寄存器
i16—— 一个 16 位立即数
reg—— 代表 r8 或 r16
imm—— 代表 i8 或 i16
seg—— 段寄存器 CS/DS/ES/SS
dst /src—— 目的操作数 / 源操作
m8—— 一个 8 位存储器操作数单元 数
m16—— 一个 16 位存储器操作数单元

表 1. 指令操作数的表达
2.1 操作数类型
2.1.3 存储器操作数

存储器操作数的偏移地址可由以下三种成分组合
存储器操作数的偏移地址可由以下三种成分组合

偏移量 + 基址 + 変址 = EA (有效地址)

偏移量 ( 位移量 ) (displacement) 是


变址是变址寄存器 (SI,DI) 中的内容。
存放在指令中的一个 8 位或 16 位的有符
常用来访问数组中的某个元素或字符串
号数。
中的某个字符。
基址是基址寄存器( BX,BP) 中的内容
。常用来指向数据段中数组或字符串的首 EA 可以由以上三个成分任意组
地址。 合后提供。
2.1 操作数类型

2.1.3 存储器操作数

如果操作数存放在存储区中 , 这样的操作
数称为存储器操作数。
2.1 操作数类型
2.1.3 存储器操作数

计算机中操作数保存的地方
计算机中操作数保存的地方

1 、指令中 2 、 CPU 的 4 、 I/O 接口


3 、存储器中
寄存器中 寄存器中 t
3. 两种情况
(1) 单个操作数
1. 由程序员直 2. 在指令中指
可在指令中指定存放这个
4. 在访问 I/O
操作数的存储单元的地址 .
接写在指令中 定 (2) 以表格或数组的形式 的专用指令中指
寄存器名 存放在存储器中的成组操 定接口中寄存器
.
作数需指定数据区的首 的端口号。
(末)地址,作为地址指针
2 .2 有效地址和段超越

当操作数存放在存储器中时,存储器存储单元的物理地
址由两部分组成:偏移地址和段地址。
在 8086/8088 的各种寻址方式中,寻找的存储单元所需的
偏移地址成为有效地址( EA )。
存储器操作数寻址时,存储单元的物理地址的另一部分是
段地址。
2 .2 有效地址和段超越

 当被访问的操作数的段基址不在约定使用的段寄存器
中 , 而在其它的段寄存器中时 , 可以使用段跨越前缀指
定其所在的段寄存器。
 段跨越前缀的表示形式:
ES: 、 CS: 、 SS: 、 DS :
 例: MOV AX,DS:[BP] MOV ES:[BX],AX
2 .2 有效地址和段超越
表 3-1 段基址和偏移量的约定情况

存储器操作数 约定段 允许指定的 偏移量


操作类型 寄存器 段寄存器
1 .指令 CS 无 IP
2 .堆栈操作 SS 无 SP
3 .普通变量 DS ES 、 SS 、 CS EA
4 .字符串指令 DS ES 、 SS 、 CS SI
的源串地址
5 .字符串指令 ES 无 DI
的目标串地址
6. BP 作基址寄存器 SS DS 、 ES 、 CS EA
2 .2 有效地址和段超越

在实模式下提供有效地址需要使用的有关
寄存器分别为:

( 1 )段寄存器 CS 、 DS 、 ES 和 SS

( 2 )通用寄存器 BX

( 3 )基址指针寄存器 BP

( 4 )変址寄存器 SI 和 DI
2 .3 与数据有关的寻址方式

指令系统设 在 8088 /
操作
计了多种操 8086 指令系统中, 数据寻址方
数采取哪一种寻 与数据有关的寻
作数的来源, 式以 MOV
址方式,会影响 址方式可以分为
寻找操作数 DST , SRC 为例
机器运行的速度 7 种,用于确定
的过程就是 讨论。
和效率。 操作数地址,从
操作数的寻
址方式。 而找到操作数。
.
2 .3 与数据有关的寻址方式
2.3.1 立即寻址方式

2.3.2 寄存器寻址方式

2.3.3 直接寻址方式

2.3.4 寄存器间接寻址方式

2.3.5 寄存器相对寻址方式

2.3.6 基址变址寻址方式

2.3.7 相对基址变址寻址方式
2 .3 与数据有关的寻址方式

2.3.1 立即寻址方式

操作:欲将一个常数送到寄存器中或者存储器中的一个单元;
我们可以将操作数直接写在指令中,
如 MOV AH,10
这种提供操作数的方式称为立即寻址方式,把该操作数称为立即数。
2 .3 与数据有关的寻址方式

2.3.1 立即寻址方式

立即寻址方 注意:
式只能出现在
源操作数的位
置。 指令的源操
作数长度应
与目的操作数
长度一致。
2 .3 与数据有关的寻址方式

2.3.1 立即寻址方式

例 1. 程序代码段所在存储器
MOV AL,6


; ( AL )= 6 OP AL
06


2 .3 与数据有关的寻址方式

2.3.1 立即寻址方式

例 2.
AX


MOV AX,1234H
OP 12 34
; ( AX )=
34
1234H
12


2 .3 与数据有关的寻址方式

2.3.2 寄存器寻址方式

 操作数存放在寄存器中,由指令指定寄存器名的寻址方式。这种寻址方式不需
要访问外部总线,存取速度较高。
 可用的寄存器:通用寄存器或段寄存器 (CS 不能用于 DST) 。
 对 16 位操作数,可以用 AX,BX,CX,DX,SI,DI,SP 和 BP;
 对 8 位操作数,可以用 AL,AH,BL,BH,CL,CH,DL,DH ;
2 .3 与数据有关的寻址方式

2.3.2 寄存器寻址方式

例 3.
MOV BX, AX ; ( BX )( AX )
; AX 中的内容不变
2 .3 与数据有关的寻址方式

2.3.2 寄存器寻址方式

例 5.
MOV AL, 78H ; ( AL ) 78H
2 .3 与数据有关的寻址方式

2.3.2 寄存器寻址方式

上述指令中的 DST 均为寄存器寻址方式。存放


在寄存器中的操作数称为寄存器操作数。
双操作数指令中至少要有一个操作数使用寄存器
寻址方式
2 .3 与数据有关的寻址方式

2.3.3 直接寻址方式

操作数的有效地址只包含位移量一种成
分,位移量的值即操作数的有效地址。
可以将该变量的有效地址直接写在指令

--- 直接寻址方式。
用途: 通用格式:
操作码 DST , EA
存取单个变量。
2 .3 与数据有关的寻址方式

2.3.3 直接寻址方式

例 7.
MOV AX,[0078H] ;缺省段寄存器为 DS 。
其功能与右面两条指令的功能等价:

MOV AX,[0078H]
MOV AL,[0078H]
MOV AH,[0079H]
执行结果如图 3-2(a)所示。
2 .3 与数据有关的寻址方式

2.3.3 直接寻址方式

例 7.
AH AL (DS)
30 50
30078 50 MOV AX,
[0078H]
30079 30
图 3-2(a)
2 .3 与数据有关的寻址方式

2.3.3 直接寻址方式

例 7.
(DS) = 3000H
物理地址 PA = 16d  (DS) + EA
=16 3000H+0078H = 30078H
字地址 30078H 中的内容: (30078H )= 3050H
执行结果是 (AX) = 3050H
2 .3 与数据有关的寻址方式

2.3.3 直接寻址方式

非默认段的情况

如果操作数在附加段中,则应指定段跨越前缀如下:
MOV AX , ES : VAR
或 MOV AL, ES:[0078H]
实际上只有在 DEBUG 环境下,才有 [0078H] 这样的表示
。在汇编语言源程序中直接寻址方式都是用符号表示的。
2 .3 与数据有关的寻址方式

2.3.4 寄存器间接寻址方式

操作数在存储器中,而该操作数的有效地
址放在 BX 、 BP 和 SI 、 DI 四个寄存器中提供给
CPU 的寻址方式。

若指令中使用 BX 、 SI 、 DI ,则默认与 DS 段寄
存器配合 ; 若使用 BP, 则默认与 SS 配合。
BX 、 BP 和 SI 、 DI 均允许使用段跨越。
2 .3 与数据有关的寻址方式
2.3.4 寄存器间接寻址方式

例 9.
MOV AX,[BX] ; AX  ( DS:[BX] )

注意它与寄存器寻址方式在形式上的区别:
MOV AX , BX ;(AX)  (BX)

源操作数的物理地址为:
PA = (DS) × 10H + (BX)
2 .3 与数据有关的寻址方式
2.3.4 寄存器间接寻址方式

例 9.
若 (DS) = 3000H, ( BX )= 78H, ( 30078H )= 12H
则: PA = 3000H×10H + 78H = 30078H
该指令的执行结果是
( AL )= ( 30078H )= 12H
2 .3 与数据有关的寻址方式
2.3.4 寄存器间接寻址方式

例 10. MOV AX,[BP] ; AX (SS:[BP])


若( SS )= 2000H ,( BP )= 80H, 则
PA = ( SS ) × 10H +( BP ) = 20080H
若( 20080H )= 5612H ,则该指令的执行结果是 ( AX )= 5612H 。
利用这种寻址方式再配合修改寄存器内容的指令可以方便地处理一
维数组,如图3-3所示 。
2 .3 与数据有关的寻址方式
2.3.4 寄存器间接寻址方式

寄存器间接寻址方式处理一维数组 X[10]
DS X0
X1
X2
BX + X3

Xi AL
X9 图 3-3 寄存器间接寻址方式执行情况
2 .3 与数据有关的寻址方式

2.3.5 寄存器相对寻址方式

操作数的 EA 是一个基址 (BX 、 BP) 或变址寄存器 (SI 、 DI) 的内容


和指令中给定的一个位移量( disp )之和 ( 见教材图 3 . 1(5)) 。

EA =(基址<或变址>寄存器)+ disp

位移量可以是一个字节或一个字的带符号数。
与段寄存器约定配合与寄存器间接寻址约定相同
2 .3 与数据有关的寻址方式

2.3.5 寄存器相对寻址方式

例 11.
MOV AL,TABLE[BX] 或 MOV AL,[BX+TABLE]
其中 TABLE 为位移量的符号表示。
指令执行结果是:
AL ← ( DS:[ BX+TABLE ] )
使用这种寻址方式可以访问一维数组 , 其
中 TABLE 是数组首地址的偏移量 , 寄存器中
存放数组元素的下标乘以元素的长度的积(一个元
素占用的字节数),下标从 0 开始计数。
2 .3 与数据有关的寻址方式

2.3.5 寄存器相对寻址方式

例 12. MOV AX, 8 [BX]


可以表示为: MOV AX,[BX+8]
若 ( DS )= 3000H ,( BX )= 70H
( 30078H )= 1234H
则 PA = 10H× ( DS )+( BX )+ DISP
= 30078H
该指令的执行结果是( AX )= 1234H 。
其中 8[BX] 为寄存器相对寻址方式 , 该指令执行情况
如图3-4所示。
2 .3 与数据有关的寻址方式

2.3.5 寄存器相对寻址方式

DS 寄存器间接寻址方式处理一维数组

BX +
8

+ 图 3-4 寄存器相对寻址执行情况

MOV AX,[BX+8]
34H AX
12H
2 .3 与数据有关的寻址方式

2.3.6 基址变址寻址方式

操作数的有效地址是一个基址寄存器和一个变址寄存器的
内容之和。 BX SI
EA=
BP + DI

缺省使用段寄存器的情况由基址寄存器决定。允许使用段
跨越前缀。使用段跨越前缀时的格式为: MOV
AX , ES:[BX][SI]
2 .3 与数据有关的寻址方式

2.3.6 基址变址寻址方式

基址变址寻址方式组合

基址 变址
BX SI
EA = BP + DI
2 .3 与数据有关的寻址方式
2.3.6 基址变址寻址方式

例 13. MOV
AL, [BX] [SI]
; ( DS:[BX+SI] )→ AL
该指令可以表示为:
MOV AL,[BX+SI]

使用该寻址方式可以访问一维数组。
用 BX 存放数组起始地址的偏移量, SI 存放数组元素的下标乘以元素
的长度,下标从 0 开始计数。则数组中任一元素的有效地址 = ( BX
) + ( SI )。
因为数组的首地址存放在寄存器中 , 因此可以访问存储器中任意已知
地址指针的数组 .
执行情况如图 3-6 所示。
2 .3 与数据有关的寻址方式

2.3.6 基址变址寻址方式
基址变址寻址方式访问一维数组
DS

BX
+ BX 存放数组起始地址的
偏移量,
SI 存放数组元素的下标
SI
+ 乘以元素的长度,
下标从 0 开始计数。
XX AL

图 3-6 基址变址寻址方式执行情况
2 .3 与数据有关的寻址方式
2.3.7 相对基址变址寻址方

有效地址分解成三个部分提供:
有效地址分解成三个部分提供:

= EA
DISP + 基址寄存器 + 変址寄存器

DISP 可以是一个字节、一个字的带符号数。
缺省使用段寄存器的情况由基址寄存器决定。
允许使用段跨越前缀。
2 .3 与数据有关的寻址方式

2.3.7 相对基址変址寻址方

例 14.
MOV AL, ARY[BX] [SI]
; ( DS:[BX+SI+ARY] )→ AL
可表示为:
MOV AL, ARY [BX+SI]
或 MOV AL,[BX+SI+ARY]

执行情况如图3-8所示。
2 .3 与数据有关的寻址方式

2.3.7 相对基址変址寻址方

相对基址变址寻址方式访问二维数组

设数组在内存中以行的形式存放。
ARY 为数组起始地址的偏移量 ,
基址寄存器为某行首与数组起始地址的距离,
即行下标 × 一行占用的字节数 ,
变址寄存器为某列与所在行首的距离
即列下标 × 元素长度,
若保持基址寄存器不变而变址寄存器改变 , 则可以访问同一行的所有元素 ;
若保持变址寄存器不变而基址寄存器改变,则可以访问同一列的所有元素。
2 .3 与数据有关的寻址方式
2.3.7 相对基址変址寻址方

相对基址变址寻址方式访问二维数组图示

DS

MOV AL,ARY [BX][SI]


BX +

SI +
XX AL
图 3-8 相对基址变址寻址方式
2 .4 与转移地址有关的寻址方式

2.4.1 段内直接寻址

2.4.2 段内间接寻址

2.4.3 段间直接寻址

2.4.4 段间间接寻址
2 .4 与转移地址有关的寻址方式

本节讨论的寻址方式是用来确定转移及调用指令的转向
地址。既根据目标地址所在的位置,用前面介绍的寻址方式将转
移目标地址的地址提供给 CPU 。下面以 8086 / 8088 的无条件转
移指令为例来说明。
无条件转移指令格式:
JMP 目标
功能:无条件转移到目标地址处执行指令。
2 .4 与转移地址有关的寻址方式
与转移地址有关的寻址方式的功能

1 、转移的目标地址有两类 2 、提供目标地址的方法有两类

1. 转移目标 2. 转移目标地址 1. 直接寻址—


地址在本逻辑 2. 间接寻址—目
在本逻辑段外为 目标地址直
段内为 标地址放在
段内转移—改 段间转移 接写在指令中 寄存器 / 存储器
变指令指针 —改变 IP 和 CS

IP 的值实现; 的值实现。
2 .4 与转移地址有关的寻址方式
2.4.1 段内直接寻址

格式: JMP 标号(符号地址)

8位
( IP )  EA =( IP )+ DISP
16 位

其中 DISP= 转移目标有效地址–当前 (IP)


CPU 通过把指令中给出的 disp 加到 IP 中得到目标地
址的 EA ,送到 (IP) 。从而使 IP 指向目标指令地址,实现
段内转移。
2 .4 与转移地址有关的寻址方式
2.4.1 段内直接寻址

段转移与近转移 )
若位移量为 8 位,称为短转移,可以实现距离当前
(IP) 为 [ + 127 ,- 128] 字节范围内的转移,
格式: JMP SHORT LAB
若位移量为 16 位,称为近转移 , 可以实现距离当前 (IP) 为
±32K 字节范围内的转移,
格式: JMP LAB
或 JMP NEAR PTR LAB
2 .4 与转移地址有关的寻址方式
2.4.2 段内间接寻址方式

程序转向的有效地址存放在一个寄存器或内存单
元中,该寄存器号或内存地址按前面介绍的与操
作数有关的寻址方式(立即寻址方式除外)获得。
取到其中的有效地址送给 IP ,实现转移。指令格式
及举例见表 3-1 。
2 .4 与转移地址有关的寻址方式
2.4.2 段内间接寻址方式

格 式 举 例 注 释

JMP
JMP BX 16 位转向地址在 BX 中
通用寄存器
16 位转向地址在 VAR 字型
JMP JMP VAR 内存变量中
内存单元 16 位转向地址在 BX 所指向
JMP WORD PTR [BX]的内存变量中

表 3-1 段内间接寻址方式
2 .4 与转移地址有关的寻址方式
2.4.2 段内间接寻址方式

设 : ( DS )= 2000H , (BX )= 0300H


( IP )= 0100H ,( 20300H )= 0500H
例 1. JMP BX ; ( IP )=( BX )= 0300H
例 2. JMP WORD PTR [BX]
CPU 首先根据寻址方式计算存放转移目标地址的内存单元的地址: PA=
( DS ) ×16 +( BX ) = 20300H,
从 (PA) 取转移目标地址的 EA 送到 IP 中,
EA=(20300H ) = 0500H (IP)
然后执行 CS:500H 处的指令 , 实现了段内间接转移。
2 .4 与转移地址有关的寻址方式
2.4.3 段间直接寻址方式

指令中直接给出转向的 4 字节的偏移量和段基址 ,
只需把它们分别送给 IP 和 CS 后即可实现段间转移。
指令格式: JMP FAR PTR LAB
;(IP) ←LAB 的 EA
;(CS) ←LAB 的段基址

字节 0 字节 1 字节 2 字节 3 字节 4

偏移量 偏移量 段基址 段基址


操作码
低8位 高8位 低8位 高8位

图 3-11 段间直接寻址方式
2 .4 与转移地址有关的寻址方式
2.4.4 段间间接寻址方式

JMP DWORD PTR 双字存储器操作数


双字存储器操作数的低 16 位取代 IP 值,高 16 位取代 CS 值,从
而实现段间转移。
可以使用除立即寻址和寄存器寻址方式以外的其它与数据有关的
寻址方式。

例:若 (DS) = 2000H , (BX) = 0300H



(20300H) = 0500H, (20302H) =
6010H
则:
指令 JMP DWORD PTR [BX] 执行后 ,
(CS)=6010H, (IP)=0500H,
因此程序转到 6010 : 0500 处执行
2 .5 寻址方式小结
 立即寻址
 寄存器寻址
段内直接寻址
段内间接寻址
 直接寻址
 寄存器间接寻址 段间直接寻址
 寄存器相对寻址 段间间接寻址
 基址变址寻址
 相对基址变址寻址

You might also like