02-汇编-寻址方式

来源:互联网 发布:蒋方舟 与男 知乎 编辑:程序博客网 时间:2024/06/05 21:57

寻址方式

指令中的操作码告诉CPU执行何种操作,而指令中的操作数即为操作的对象,在编写程序过程中,往往不会在指令中给出操作数,而是给出操作数所在的寄存器的名称操作数所在存储单元的逻辑地址

寻址方式就是如何根据指令提供的信息寻找到操作对象。

立即寻址方式

如果在指令中直接给出了操作数,即无须再去寻找操作数了,这种方式称为立即数寻址。

把直接给出的操作数称为立即数。

如:

MOV AX,1234HMOV CX,40DMOV AX,"a" //相当于 mov ax,0061HMOV BL,"b" //相当于 mov bl,62H

注意:
1. 立即数只能出现在源操作数中,不能出现在目的操作数中。
2. 在立即寻址方式中,立即数的位数必须要与目的寄存器的位数符合。
3. 立即数可以以数值形式出现,也可以以字符或字符串的显示出现,如MOV AX,"ab"相当于mov ax,6162H是允许的。

寄存器寻址方式

操作数在寄存器中,并且以寄存器的形式出现在指令中,这种方式称为寄存器寻址。

如:

MOV AX,BX

注意:
1. CPU访问寄存器的速度比访问存储器数的速度要快,所以使用寄存器提供操作数可以提高运算的速度。
2. 在寄存器寻址的方式中,也要注意两个操作数的类型要相同。
3. 源操作数可以使用8位或16位寄存器或段寄存器,但不可以使用专用寄存器IP和FR。

直接寻址方式

如果在指令中给出操作数的偏移地址(EA),这种方式称为直接寻址。

直接寻址的特征是:在指令中给出偏移地址EA是被方括号括起来的一个常量。这种寻址方式给出了操作数所在数据段(附加段)的偏移量,所以寻找该操作数还需要确定操作数所在段的首地址,然后计算物理地址。

MOV AX,DS:[2000H];AX←(DS×16+2000H)MOV CS,ES:[0ABCDH];CX←(ES×16+0ABCDH)

注意:
1. 偏移量可以用负数表示,如果给出的直接地址是负数的话,在汇编程序中会对该负数进行求补。

将附加段中的mess单元的字内容(3322H)送入BX寄存器
data segment
mess db 22h,33h; 在附加段中定义数据22h和33h
data ends

code segment  assume cs:code,es:datastart: mov ax,data    ;将附加段的首地址传送给AX mov es,ax      ;将附加段的首地址传送给ES寄存器 mov bx,es:[0000h]  ;将es:0000单元的内容送入bx寄存器 mov ah,4ch int 21h code endsend start


寄存器间接寻址

将操作数的直接地址送入基址寄存器BX或BP,或者变址寄存器SI或DI中的任意一个,在指令中使用这些存储了直接地址的寄存器作为操作数的地址指针,实现操作数的提取或存储,这种方式称为寄存器的间接寻址方式。

特征是:在指令中出现了用方括号括起来的的基址寄存器BX、BP、SI、DI

MOV AX,[BX]MOV CX,[SI]

注意:
1. 只能使用这4个寄存器
2. 当采用BX,SI,DI时,操作数存放在数据段中,段寄存器采用DS;当采用BP时,操作数存放在堆栈段中,段寄存器用SS。

采用BX寄存器间接寻址的方式见数据段中的0AB05H送入CX寄存器
data segment
mess db 05h,0ABH; 在附加段中定义数据05h和0abh
data ends

code segment assume cs:code,ds:datastart: mov ax,data  mov ds,ax     ;将数据段的首地址送入到DS寄存器 mov bx,offset mess ;操作数偏移地址送入到bx mov cx,[bx]   ;将bx所指的字节单元内容送入到cx mov ah,4ch int 21hcode endsend start


采用BP寄存器间接寻址方式将1234H字数据送入DX:

stack1 segment stack var1 dw ?stack1 endscode segment assume cs:code,ss:stack1start: mov ax,stack1 mov ss,ax mov ax,1234h push ax mov bp,sp mov dx,[bp] mov ah,4ch int 21hcode endsend start

相对寄存器寻址方式

将操作数存放在存储器中,而操作数的有效地址EA由BX,BP,SI,DI中的任意一个寄存器的内容再加上指令中给出的8位或16位偏移量之和组成。这种方式称为相对寄存器寻址。

特征是:在寄存器间接寻址的基础上,基址寄存器BX或BP,或者变址寄存器SI或DI,再加上一个8位或16位偏移量,其和构成操作数的有效地址。

MOV AX,[BX+2000H]MOV CX,[SI+12H]

注意事项与寄存器间接寻址方式相同

将数据段中以block开始的数据块的第五个字数据送入DX寄存器

data segment block dw 1234h,2345h,3456h,4567h,5678h,6789hdata endscode segment assume cs:code,ds:datastart: mov ax,data mov ds,ax mov si,offset block ;将数据块的首地址赋予si mov dx,[si+8] mov ah,4ch int 21hcode endsend start

基+变寻址方式

在指令中给出一个基址寄存器(BX,BP)和一个变址寄存器(SI,DI)

用这种方式实现上面的功能

data segment block dw 1234h,2345h,3456h,4567h,5678h,6789hdata endscode segment assume cs:code,ds:datastart: mov ax,data mov ds,ax mov bx,offset block mov si,0008h mov dx,[bx+si] mov ah,4ch int 21hcode endsend start
0 0