《汇编》寻址方式

先来说说寻址方式的概念

寻址方式:寻找指令中所需操作数的各种方法, 也就是提供指令中操作数的存放信息的方式

一条指令由两部分组成 操作码:操作数

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

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

下面是几种操作数:

(1)立即数操作数——操作数在指令代码中提供

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

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

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

计算机中不只一种寻址方式,一般的寻址方式如下:

1.立即数寻址

2.寄存器寻址

3.直接寻址

4.寄存器间接寻址

5.基址寻址/变址寻址

6.基址变址寻址

7.串操作寻址方式

8. I/O端口寻址

那么接下来一个个介绍一下几种寻址方式

1.立即数寻址

立即数寻址方式的指令中,所需操作数直接包含在指令代码中,这种操作数称为立即数

比如说MOV AH,20H

MOV AX 20A0H

立即数只能作为源操作数,不能作为立即操作数

2.寄存器寻址

就是将指令中的操作数放在寄存器中,寄存器可以是通用寄存器,也可以是段寄存器

比如:AH、AL、AX、CX、DS、ES等

例如:MOV AX,BX

MOV DS,AX

接下来的几种存储方式都和存储器有关,操作数在存储器中的存放方式不同

一个存储单元的逻辑地址的表现形式 段基址:偏移量

其中段基址又段寄存器提供,而偏移量表示了段单元与其实地址之间的距离,也叫做有效地址EA

3.直接寻址

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

直接寻址方式一般用符号或者常数进行表示

(1) 符号表示

MOV BX,VAR=>MOV BX,DS:VAR

它表示将数据段中,偏移了VAR个字节距离的字单元内容送到寄存器BX中

MOV AL,DATA+2=>MOV AL,DS: DATA+2

它表示将数据段偏移了DATA+2的字节单元内容送入AL中

(2) 用常数表示

MOV AX,DS:[64H]

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

4.寄存器间接寻址

寄存器间接寻址顾名思义就是将偏移量实现存在某个寄存器中,然后隐藏了所在段的段寄存器,就可以直接将寄存器中的值修改,就可以实现同一条指令对不同的寄存器进行操作

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

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

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

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

5.基址寻址/变址寻址

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

指令中使用BX或BP时为基址寻址。指令中使用SI或DI时为变址寻址

段寄存器的隐含使用规则与寄存器间接寻址方式相同

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

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

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

6.基址变址寻址

操作数的有效地址由三部分组成:基址+变址+位移量

如果基址使用的是BX的话段寄存器就是DS,如果基址使用的是BP的话段寄存器就是SS

MOV CX,100H[BX][DI]

MOV TABLE[BX][DI],AX

下面的例子是错误的

MOV AX,ARRAY[BX][BP]

MOV AX,TABLE[SI][DI]

在基址变址寄存器中,有两个分量可以进行修改,因此是最灵活的一种寻址方式,可以方便的对二维数组进行修改

7.串操作寻址方式

在寻找源操作数时,隐含使用SI作为地址指针,在寻找目的串时,隐含使用DI作为地址指针,在串操作完成之后,自动对SI和DI进行修改,使它们指 向下一个操作数

8.I/O端口寻址

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

(1)直接端口寻址

指令中就直接给出端口的位置,地址一般采用两位十六进制数,也可以用符号表示

直接端口寻址可以访问的端口数有0~255个

例如 IN AL,25H

(2)寄存器间接端口寻址

把I/O端口的地址先送到DX中,用DX作间接寻址寄存器

例如:MOV DX,378H

OUT DX,AL

如果访问的端口地址值大于255,则必须用I/O端口的间接寻址方式

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(《汇编》寻址方式)