汇编语言(四)--指令的‘与数据有关的’寻址方式
本文最后更新于: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。
2.存储器写操作
MOV DS:[4000H],AX
将AX中的字写入数据段的4000H单元。
有效地址EA = 4000H。物理地址 DS*10H + EA。
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。
EA是从寄存器中得到的,所以叫寄存器间接寻址方式。并且8086CPU只允许BX、BP、SI、DI这四个寄存器作为间址寄存器。
MOV AX,[CX] ;错误
寄存器间接寻址方式适用于简单的表格处理。
寄存器相对寻址方式
MOV AX,[BX+1234H]
操作数放在内存中,但是操作数的EA在寄存器的内容上再加上一个8位或者16位的位移量。
同样,还是有效地址由BX、SI、DI指出,则默认对应于数据段DS。若由BP指出,则对应于堆栈段SS。
寄存器相对寻址方式常用于查表操作。
寄存器相对寻址方式的四种写法
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)的和。
故共有四种情况。
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)以及一个位移量的和。
相对基址变址寻址方式可用于二维表的查找和栈处理。
相对基址变址寻址方式的几种写法
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 ;位移量可用.连接
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!