先来说说寻址方式的概念
寻址方式:寻找指令中所需操作数的各种方法, 也就是提供指令中操作数的存放信息的方式
一条指令由两部分组成 操作码:操作数
操作码:表示该指令应完成的具体操作,如 加法、减法、乘法、移位等等,在汇编语言中使用一定的符号来表示,称为助记符。如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端口的间接寻址方式