汇编语言(四)--指令的‘与数据有关的’寻址方式

本文最后更新于:2019年6月26日 晚上

概览:三种与数据有关的寻址方式。

寻址方式

寻址方式就是指令中提供操作数或者操作数地址的方式,即寻找操作数地址的方法。

寻址方式分为与数据有关的寻址方式与转移地址有关的寻址方式

与转移地址有关的寻址方式如 jmp la1,这样的转移指令、循环指令、子程序调用指令等与转移地址有关。其余指令的寻址方式都与数据有关。

数据操作数

数据有可能放在内存中,有可能放在CPU的寄存器中,还有可能直接写在指令中。

如果不在内存中存放,操作数就没有逻辑地址的概念,CPU不用访问存储器就能够得到操作数。

如果操作数在内存中,那么操作数的偏移地址以有效地址EA来表示。

寻址方式分类

引图

立即寻址方式

所要找的操作数(即立即数)直接写在指令中。

立即数只能够出现在源操作数的地方!

立即数的类型必须要和目的操作数的类型相一致!

当然立即数是存在于指令中的,而指令是存在于代码段的。

mov ax,3060H
mov al,21H

寄存器寻址方式

操作数在寄存器中,在指令中指定寄存器名即可完成。

CPU在寄存器中直接得到操作数,不用访问内存,这种寻址方式指令短,速度快,但是可用资源少。

8位寄存器:AH、AL,BH、BL、CH、CL、DH、DL

16位寄存器:AX、BX、CX、DX、SI、DI、BP、SP

mov ax,bx    ;都是16位,寄存器寻址
mov al,ch    ;都是8位,寄存器寻址
mov ax,4650H;目的操作数寄存器寻址,源操作数立即寻址

存储器寻址方式

操作数存放在内存中,想要得到操作数,CPU必须要经过系统总线访问存储器。

而编写汇编程序时采用的时逻辑地址形式,故要计算有效地址EA(即逻辑地址里的偏移地址部分)。

且对于双操作数指令,两个操作数不允许同时使用存储器寻址方式,即不允许两个操作数都是存储单元。??

有效地址EA –即逻辑地址里的偏移地址

直接寻址方式

mov ax,ds:[2000H]

[]内的数据为操作数的偏移地址,前缀DS:表示该单元在数据段。

在用MASM工具汇编时,不写前面的前缀只写[2000H],汇编会认为是立即数而非偏移地址!

而在DEBUG工具中,使用A命令来写就不需要加前缀,默认是数据段。

操作数的有效地址EA直接存放在指令中,CPU在取指令时直接取得操作数的有效地址,–故为直接寻址。

1.存储器读操作

MOV AX,DS:[2000H]

表示从数据段的2000H单元读一个字送入AX。

有效地址EA = 2000H。物理地址 DS*10H + EA。

read memory

2.存储器写操作

MOV DS:[4000H],AX

将AX中的字写入数据段的4000H单元。

有效地址EA = 4000H。物理地址 DS*10H + EA。

write memory

3.符号地址

除了直接使用数值作为EA,还可以使用符号地址的形式,–即给存储单元起一个名字

在程序中使用符号地址,方便记忆和修改。

VALUE DW 2345H    ;使用DW定义一个字的符号VALUE=2345H
MOV AX,VALUE    ;这里用不用中括号括起来都可以,段地址默认都是DS
MOV AX,[VALUE]    ;

注意:使用EQU伪指令来指定符号地址,必须要加前缀指明哪个段!

4.段超越

即与存储器有关的寻址方式,默认段是数据段,但也可以放在其他三个段,这种就叫段超越。

需要在指令中用前缀指出是哪个段!

VALUE EQU 1000H        ;EQU伪指令符号,表示VALUE=1000H
MOV AX,DS:[VALUE]    ;指出存储单元在DS
MOV AX,ES:[VALUE]    ;指出存储单元在ES

寄存器间接寻址方式

mov ax,[bx]

操作数放在内存中,但是操作数的EA在寄存器BX、BP、SI、DI之中,且操作数的段地址存放于DS或者SS。

其中若有效地址由BX、SI、DI指出,则默认对应于数据段DS。

若有效地址由BP指出,则对应于堆栈段SS。

indirect

EA是从寄存器中得到的,所以叫寄存器间接寻址方式。并且8086CPU只允许BX、BP、SI、DI这四个寄存器作为间址寄存器

MOV AX,[CX]    ;错误

寄存器间接寻址方式适用于简单的表格处理

寄存器相对寻址方式

MOV AX,[BX+1234H]

操作数放在内存中,但是操作数的EA在寄存器的内容上再加上一个8位或者16位的位移量。

同样,还是有效地址由BX、SI、DI指出,则默认对应于数据段DS。若由BP指出,则对应于堆栈段SS。

relative

寄存器相对寻址方式常用于查表操作

寄存器相对寻址方式的四种写法

MOV AX,[BX+1234H]    ;
MOV AX,[BX+TOP]        ;TOP是符号地址,位移量
MOV AX,[BX].1234H    ;位移量可用.连接
MOV AX,TOP[BX]        ;TOP是符号地址,位移量

基址变址寻址方式

MOV AX,[BX+SI]

操作数存放在内存中,操作数的EA为一个基址寄存器(BX、BP)和变址寄存器(SI、DI)的和。

故共有四种情况。

base

MOV AH,ES:[SI+BX]    ;
MOV AH,ES:[SI][BX]    ;两种写法都是可以的!
MOV [BP+SI],CX
MOV DL,SS:[BX+SI]

基址变址寻址方式可用于二维表的处理

相对基址变址寻址方式

MOV AX,[BX+SI+1234H]

操作数存放在内存中,操作数的EA为一个基址寄存器(BX、BP)与变址寄存器(SI、DI)以及一个位移量的和。

relativebase

相对基址变址寻址方式可用于二维表的查找栈处理

相对基址变址寻址方式的几种写法

MOV AX,[BX+SI+1234H]    ;
MOV AX,[BX+SI+TOP]        ;TOP是符号地址,位移量
MOV AX,TOP[BX+SI]        ;TOP是符号地址,位移量
MOV AX,TOP[BX][SI]        ;TOP是符号地址,位移量
MOV AX,[BX+SI].1234H    ;位移量可用.连接