0%

X86指令体系中的寻址方式

前言:学习8086指令体系下的寻址方式

操作数类型

指令操作数可以存放在指令中寄存器中内存中端口中。端口是是接口中的寄存器

操作数依其所在的不同位置可分为三种类型:立即数寄存器操作数存储器操作数

1、立即数

操作数由指令直接给出。立即数可以是数据,包括十进制数、二进制数和十六进制数等等。也可以是确定的表达式

2、寄存器操作数

操作数在寄存器中。指令需指名寄存器名称。寄存器操作数可以是源操作数(OPS),也可以是目的操作数(OPD)

3、存储器操作数

操作数在内存中,操作数的地址就是它在内存中的物理地址,其中物理地址=段起始地址+段内偏移地址,汇编语言程序中段起始地址由其他方式确定,所以指令中只要给出操作数的偏移地址,即有效地址EA

操作数的寻址方式

操作数的寻址方式就是寻找操作数所在地址的方式

操作数的寻址首先要确定操作数类型和操作数的位数。本文章主要介绍7中操作数的寻址方式

注意:8086指令体系中的操作数的位数由两种——8位和16位。在二地址指令中两个操作数的位数必须一致,就是说源操作数和目的操作数应同是8位或者16位


7种寻址方式

1、立即寻址方式

操作数类型是立即数;立即数的位数可以是8位或者16位,也可以是带单引号的字符

1
2
mov cl,0A5H
mov bh,'A' ;指令执行后,(BH = 41H,41H是A的ASCII码)

2、寄存器寻址方式

操作数在寄存器中

这种寻址方式由于不需要访问内存,所以指令速度比较快。寄存器可以是8位或16位

1
mov al,bl  ;假设al = 34H,bl = 11H,则指令执行完后al = 11H,bl不变

3、直接寻址方式

操作数地址是16位偏移量(有效地址EA)直接包含在指令中,而操作数则默认在数据段中

操作数的物理地址是数据段寄存器DS中的内容左移4位后,加上16位的偏移量

物理地址PA = (DS) × 16 + EA

1
2
mov ax,[1234H]  ;操作数默认在数据段中,所以操作数的物理地址 = (DS) × 16 + 1000H
;设(DS) = 2000H,物理地址PA = 21234H,指令执行后(AX) = 5213H

在这里插入图片描述

在直接寻址方式中,计算机先算出操作数的物理地址,再访问内存。16位寄存器中低位字节对应低地址高位字节对应高地址

1
2
mov dx,ES:[1000H]
;ES:[1000H]为段超越,说明操作数在附加段中,所以操作数的物理地址 = (ES) × 16 + 1000H。这种方式也可以得到DX寄存器的值

下列指令也是直接寻址方式,其中ARRAY为符号地址指令执行过程中与数值地址相同

1
mov dx,ARRAY  ;或写成 mov dx,[ARRAY]

4、寄存器间接寻址方式

操作数在内存中

操作数的有效地址在变址寄存器SI、DI或者基址寄存器BX,BP

注意:只有SI、DI、BX、BP这四个寄存器可以用来存放地址

如果指令中指定的寄存器是BX、SI、DI,则DS为默认段,即没有特别指明时操作数在数据段,用DS寄存器的内容作为段地址

如果指令中用BP寄存器,则SS是默认段操作数在堆栈段中。

物理地址PA = (段寄存器) × 16 + (BX/SI/DI/BP)

1
2
mov ax,[DI]  ;操作数默认在数据段,操作数的有效地址在DI中
;设(DS) = 4000H, (DI) = 2000H,则物理地址PA = 42000H

下列指令是寄存器间接寻址方式的其他指令形式:

1
2
mov al,[BP]  ;从物理地址中读取一个字节的数送给AL
mov ax,[BP] ;PA = (SS) × 16 + (BP),BP的寄存器中偏移量默认在堆栈段
1
mov ax,DS:[BP]  ;操作数的物理地址 = (DS) × 16 + (BP),段超越,BP寄存器的偏移量在数据段

5、寄存器相对寻址方式

这种寻址方式是以指定的寄存器内容,**加上指令中给出的位移量D(8位或者16位),**并以一个段寄存器为基准,给出操作数的地址

指定的寄存器一般是一个基址寄存器(BX、BP)或者一个变址寄存器(SI、DI)

有效地址等于寄存器内容加上偏移量。可用的寄存器仍是BX、BP、SI、DI

计算物理地址的时候,默认段和段超越与寄存器间接寻址方式相同

物理地址PA = (段寄存器) × 16 + (BX/SI/DI/BP) + D

1
2
3
mov ax,[DI+10H]  ;操作数默认在数据段中,操作数的有效地址为DI寄存器中值加上位移量10H.即EA = (DI) + 10H
;设(DS) = 4000H,(DI) = 2000H,则物理地址PA = 40000H +2000H + 10H = 42010H;
mov ax,10H[DI] ;跟上式意思相同

下列指令是寄存器相对寻址的其他指令形式

1
2
3
4
mov cl,[BP+0205H]  ;操作数的物理地址 = (SS) × 16 + (BP) +0205H,BP寄存器中的偏移量默认在堆栈段,只读取一个字节送给CL寄存器

mov ax,BUF[SI]
mov ax,[BUF + SI] ;这两条指令等价,其中BUF是具有确定值的8位或者16位的偏移量,读取2个字节的数据送给AX寄存器

6、基址变址寻址方式

用一个基址寄存器与一个变址寄存器的值相加作为操作数的偏移地址

通常把BX和BP看作基址寄存器,把SI和DI作为变址寄存器。也就是说,把(BX,BP)寄存器其中的一个值与(SI,DI)寄存器其中一个值相加作为操作数的偏移地址

不允许搭配[BP + BX]、[SI + DI]

当基址寄存器为BX时,段寄存器使用DS,当基址寄存器为BP时,段寄存器用SS

物理地址PA = (段寄存器) × 16 + (BX/BP) + (SI/DI)

1
2
3
4
mov ax,[BX + SI]  ;操作数默认在数据段,操作数的有效地址为BX寄存器上的值加上SI寄存器中的值
;即EA = (BX) + (SI),操作数的物理地址 = (DS) × 16 + (BX) + (SI)
mov ax,[BX][SI] ;跟上面指令是一个意思
mov ax,[BP + SI] ;操作数物理地址时PA = SS × 16 + (BP) + (SI)

7、相对基址变址寻址方式

偏移地址由三部分构成:基址寄存器的值 + 变址寄存器的值 + 位移量D(8位/16位)

基址寄存器、变址寄存器及对应的默认段与基址变址寻址方式相同

物理地址PA = (段寄存器) × 16 + (BX/BP) + (SI/DI) +D

1
2
3
mov ax,[BP + SI + 06H]  ;操作数默认在数据段,操作数的有效地址位BP寄存器中的值加上SI寄存器中的值再加上偏移量
;EA = (BP) + (SI) + 06H
;PA = (SS) × 16 + (BP) + (SI) +06H