Intel 8086/8088系统寻址方式

计算机的指令集合称为指令系统。一条指令主要包括操作码和操作数。

 

操作码表示该指令要完成的操作,如传送、加、减、乘、除等。 操作数字段表示操作码所需操作数的来源和操作结果的去向。

 

寻址方式是规定如何对指令中操作数字段作出解释以找到操作数的方法。8086/8088有以下几种寻址方式:

 

寄存器寻址方式、立即数寻址方式、存储器寻址方式(直接寻址方式、寄存器间接寻址方式、变址和基址寻址方式、基址变址寻址方式)、串操作寻址方式、I/O端口寻址方式。

 

1. 寄存器寻址方式

 

指令所需的操作数在寄存器中,按指令给出的寄存器地址去获得操作数。 在汇编指令中,寄存器地址直接用寄存器名表示,如AXBXCLSIDS等,这些寄存器可以是8位的,也可以是16位的。 例如:MOV BL,AL 就是将AL(源)中的内容送到BL(目的)中

 

特点:操作数在CPU内部的寄存器中,不需执行总线周期,执行速度快。

 

2. 立即数寻址方式

 

指令所需的操作数直接在指令代码中,随着取指令一起取到BIU的指令队列中。

 

特点:执行速度快,常用来提供常数。

 

在汇编指令中,立即数是数值则直接书写,如是字符则加上引号。立即数只能作为源操作数。 若立即数是以A~F开始的十六进制数,则必须在数前面加0,否则立即数被当作符号处理。 例如:MOV CX,1000H(数值作立即数);MOV AL,0AH(以字符开头的十六进制数); MOV AH,'A'(字符作立即数);MOV DX,"AB"(字符串作立即数)

 

3. 存储器寻址方式

 

上述两种寻址方式,操作数在寄存器或指令中。 以下几种寻址方式,操作数在存储器,也就是我们通常所说的内存中。请牢记,在8086/8088指令体系中,存储单元地址使用逻辑地址:段基值<<4+偏移量,即20位地址。寻址范围是1M

 

通常汇编指令中,不直接给出提供段基值的段寄存器名,而是执行指令时使用隐含来源, DS提供数据段的段基值。因此,存储器寻址方式主要讨论如何形成操作数逻辑地址的偏移量。

 

这里先说一个概念——有效地址:按指令中存储器寻址方式计算得到的偏移量称为有效地址(Effective AddressEA)。

 

有效地址EA是由三个地址分量的某种组合:

    位移量:指令代码中的一个8/16位立即数

    基地址:通常用来指向某局部存储区的起点,其为BXBP的内容

    变址量:通常用来访问某一数组元素或某一字符串,其为SIDI的内容

 

EA = 基地址 + 变地址*比例因子 + 位移量

 

注意,80386后的32位寻址方式添加了一个比例因子概念,以满足各种C语言数据结构的灵活寻址。这个比例因子只能为1248,不过大多数情况下为1

 

根据三个地址分量的不同组合,有4种不同的存储器寻址方式,他们是直接寻址方式、寄存器间接寻址方式、变址和基址寻址方式、基址变址寻址方式

 

1)直接寻址方式

 

这是最简单的寻址方式,指令所需的操作数在存储器中,操作数的有效地址EA直接由指令代码中的位移量提供。需要说明的是,操作数的段基址默认为DS,如果要对代码段、堆栈段或附加段中的数据寻址,应在指令中增加段前缀。在汇编指令中,直接寻址方式可用数值地址或符号地址来表示:

 

数值地址:

MOV BX, [1000H]

MOV AX, ES:[2000H]

 

符号地址:

 

在汇编语言程序中,常用符号地址表示存放操作数的存储单元。 故汇编指令中,可用符号地址表示的直接寻址方式来存取操作数。例如:传送指令中用符号地址:

VAR  DD  1212H

DA_BYTE  DB  ?

DA  DB  4BH

MOV BXVAR ;将VAR指向的内容传送到BX

MOV DA_BYTE,0FH ;将立即数0FH置入DA_BYTE指向的字节单元

MOV CL,DA+3 ;将由DA地址偏移3个字节的字节单元内容送到CL

 

再强调一下,如果操作数在数据段中,则指令中不必给出DS;如果操作数不在数据段中,则必须给出段寄存器名。 直接寻址方式常用于访问符号地址(变量名)表示的存储单元中的操作数。

 

2)寄存器间接寻址方式

 

所谓间接寻址,就是指令所需的操作数在存储器中,操作数的有效地址EA直接从 SI/DI/BX/BP 中获得,也就是拐了一个弯。如以 SIDIBX 间接寻址时,隐含使用DS;如以 BP间接寻址,则隐含使用 SS。有些书上也这么说,如果单独使用基址寄存器或变址寄存器,则分别称为基址寻址或变址寻址;若同时使用基址寄存器和变址寄存器,就叫做基址变址寻址。

 

我们先来看几个一般寄存器间接寻址,如:

 

MOV CH,[SI] ;等价于 MOV CH,DS:[SI] ,变址寻址

MOV [DI],BX ;等价于 MOV DS:[DI],BX变址寻址

MOV AL,[BX] ;等价于 MOV AL,DS:[BX],基址寻址

MOV CX,[BP] ;等价于 MOV CX,SS:[BP],基址寻址

 

3)寄存器相对寻址

 

指令所需的操作数在存储器中,操作数的有效地址EA是两个地址分量之和:

     变址相对寻址:操作数的EASI/DI内容与位移量之和。

     基址相对寻址:操作数的EABX/BP内容与位移量之和。

 

变址或基址寻址若使用SIDIBX ,则隐含使用DS;若使用 BP,则隐含使用 SS 汇编指令中位移量可用数值或符号地址。还是举例说明:

TAB  DB  20H

ARY  DB  30H

STR  DB  40H

MOV CH, 10H[SI] 等价于 MOV CH, DS:[10H+SI]

MOV TAB[DI], AX 等价于 MOV DS:[20H+DI], AX

MOV AL, ARY[BX] 等价于 MOV AL, DS:[30H+BX]

MOV STR[BP], DX ;等价于 MOV SS:[40H+BP], DX

 

变址或基址相对寻址常用来访问主存中的一维数组、表格、字符串等。 变址和基址相对寻址中,位移量表示基准量,如数组首址;而基址或变址寄存器的内容为相对基准量的一个值,如某数据元素相对首址的字节数。

 

当然,操作数的有效地址EA也可以是三个地址分量之和:BX/BP内容、 SI/DI内容、位移量。 基址变址寻址的寄存器若使用SIDIBX ,则隐含使用DS;若使用 BP,则隐含使用 SS。汇编指令中位移量可用数值或符号地址,其使用格式为:

TAB  DB  20H

ARY  DB  30H

STR  DB  40H

MOV CH, 10H [BX] [SI] 等价于 MOV CH, DS:[10H +BX+SI]

MOV TAB [BX] [DI], AX 等价于 MOV DS:[20H+BX+DI], AX

MOV AL, ARY[BP] [SI] 等价于 MOV AL, SS:[30H+BP+SI]

MOV STR[BP] [DI], DX 等价于 MOV SS:[40H+BP+DI], DX

 

基址变址寻址常用来访问主存中的二维数组,位移量表示基准量,如数组首址;而基址寄存器的内容为相对基准量的一个值,属于一维;变址的寄存器内容为相对基址寄存器的内容的一个值,属于二维。

 

 

你可能感兴趣的:(x86,PC汇编及BIOS编程)