汇编基础(二)

· 寻址方式

一条指令通常由两大部分构成:


操作码:表示该指令应完成的具体操作,如加法,减法,乘法,移位等等。在汇编语言中使用一定的符号来表示为助记符。

如ADD,PUSH,POP,MOV等等。

操作数:表示该指令的操作对象。如移位操作的被移位数,加法操作的加数等等。它可以是一个操作数,也可以是多个操作数。这取决于操作码部分的具体需要。


在Intel 8086/8088各指令中提供操作数的方法有以下四种:

(1)立即数操作数--操作数在指令代码种提供


(2)寄存器操作数--操作数在CPU的通用寄存器或段寄存器中

(3)存储器操作数--操作数在内存的存储单元中

(4)I/O端口操作数--操作数在输入输出接口的寄存器中

1)首先看立即数寻址,立即数寻址的指令中,所需操作数直接包含在指令代码中,这种操作数称为立即数。

立即数可以是8位,也可以是16位的。例:MOV AH, 20H 它表示将8位立即数20H送入AH中,如图

例2:MOV AX, 20A0H 它表示将16位立即数20A0H送入AX中


由于在指令执行过程中,立即数作为指令的一部分直接从BIU的指令队列中取出,它不需要另外占用总线周期,因此这种寻址方式执行速度快。但是注意:立即数只能作为源操作数,而不能作为目的操作数,因为它不是存储器。

2)寄存器寻址 寄存器寻址方式是指指令中所需的操作数在CPU的某个寄存器中。寄存器可以是8位或16位通用寄存器,或者是段寄存器。如:AH,AL,AX,CX,DS,ES等。例如MOV AX, BX MOV DS, AX 由于存取寄存器操作数完全在CPU内部进行,不需要总线周期,所以执行速度很快。

后面介绍的几种寻址方式其操作数都是在存储器中,它们主要区别就是操作数在内容中存放地址的形成方法不同。一个存储单元逻辑地址表示形式: 段基值:偏移量 段基址由某个cpu寄存器提供,偏移量表示了该存储单元与段起始地址之间的距离,也叫做有效地址EA。

有效地址EA是以下三个地址分量的几种组合,由CPU的执行单元EU计算出来的。

1.位移量:位移量是指令中直接给出的一个8位或16位数。一般源程序中以操作数名字(变量名或标号)的形式出现。

2.基址:由基址寄存器BX或基址指针BP提供的内容

3.变址:由源变址寄存器SI或目的变址寄存器DI提供的内容


位移量,基址,变址三个地址分量组合时,若有两个或两个以上分量时,将进行2^16为模的十六位加法运算

下面是由这三个地址分量的不同组合所形成的四种寻址方式。

<1>直接寻址

在直接寻址方式的指令中,操作数的有效地址EA只有位移量地址分量。


在汇编语言源程序中,直接寻址方式用符号或常数来表示。

(1)用符号表示 例:MOV BX, VAR=>MOV BX, DS: VAR 它表示将数据段中,偏移了VAR个字节距离的字单元内容送到寄存器BX中 例2:MOV AL, DATA+2=>MOV AL,DS:DATA+2 它表示将数据段偏移了DATA+2的字节单元内容送入AL中

(2)用常数表示

例MOV AX,DS:[64H] 它表示从当前数据段开始,偏移100个字节的字单元内容送到AX中。不能写为:MOV AX, 64H

注意:用常数表示时,必须用方括号括起来。段寄存器不能省略。

<2>.寄存器间接寻址

操作数有效地址EA直接从基址寄存器(BX或BP)或变址寄存器(SI或DI)中获得


寄存器间接寻址就是事先将偏移量存放在某个寄存器(BX,BP,SI,DI)中,这些寄存器就如同一个地址指针。在程序运行期间,只要对寄存器内容进行修改,就可以实现用一条指令实现对不同存储单元进行操作

指示存储器所在段的段寄存器可以省略,当指令中使用的时BP寄存器,则隐含表示使用SS段寄存器,其余情况则隐含使用DS段寄存器


例如:MOV AX,[BX]=>MOV AX,DS:[BX]

        MOV BH,[BP]=>MOV BH, SS:[BP]

        MOV [DI], BX=>MOV DS: [DI], BX

<3>.基址寻址/变址寻址

操作数的有效地址EA等于基址分量或变址分量加上指令中给出的位移量。

       



例;MOV AX, 10H[SI]=>MOV AX, DS: 10H[SI]


      MOV TABLE [DI],AL=>MOV DS: TABLE[DI],AL


注意:当位移量为常数时,不能加方括号


这两种寻址方式只需通过改变寄存器的内容就可用一条指令访问不同的存储单元,并且由于增加了一个位移量分量,

因此它们能够很方便地访问数组和表格数据

由于这两种寻址方式中寄存器中的内容是相对于由位移量指定的初始单元。因此也叫寄存器相对寻址



<4>.基址变址寻址

操作数的有效地址时三个地址分量之和,即:EA=基址+变址+偏移量


例如:MOV CX, 100H[BX][DI]

          MOV TABLE[BX][DI], AX

下面用法是错误的  

          MOV AX, ARRAY[BX][BP]

          MOV AX, TABLE[SI][DI]

在基址变址寻址方式中,程序运行期间有两个地址分量可以修改。因此它是最灵活的一种寻址方式,可以方便地对二维数组进行访问





3)串操作寻址方式

8086/8088设置有专门用于串操作的指令,这些指令的操作数虽然也在存储器中,但它们不使用前面介绍的各种寻址方

式,而隐含地使用变址寄存器SⅠ和DI专门指示。

在寻找源操作数时,隐含使用SI作为地址指针

在寻找目的串时,隐含使用DⅠ作为地址指针

在串操作完成之后,自动对SI和DI进行修改,使它们指向下一个操作数

4).I/O端口寻址

在计算机系统,对I/O端口的寻址方式有以下两种方法。

 

存储器编址方法

将IO端口视为存储器的一个单元,对端口的访问就如同访问存储单元一样。访问存储器的指令和各种寻址方式

同样适用对I/O端口的访问。


特点:程序设计灵活,但需要占用存储地址空间。

I/O端口编址方法


IO端口的地址与存储器地址分开,并使用专门的输入指令和输出指令。

8086/8088系统中就是采用的这种方式。可以最多访问64K个字节端口或32K个字端口,用专门的IN指令和OUT指令问。寻址方式有如下两种


猜你喜欢

转载自blog.csdn.net/weixin_41573650/article/details/80722324