汇编语言-寻址方式总结

7种寻址方式

Posted by Kingtous on March 26, 2019

立即寻址方式:操作数在指令中给出

注意:只能用于SRC操作数,SRC与DST的字长一致

寄存器寻址方式:操作数在指定的寄存器中

注意:SRC与DST的字长必须一致,CS不能用MOV修改

(以下归纳为存储器寻址方式,地址从内存单元中取出)

直接寻址方式:有效地址EA由指令直接给出

通过给出来的地址得到具体值

注意:

a.隐含的段为数据段(DS)

b.可以使用段跨越前缀,如mov ax,es:[2000h]

c.操作数可由变量表示 如mov ax,word ptr value可以存放字节到字

寄存器间接寻址方式:EA在基址寄存器(BX/BP)或变址寄存器(SI/DI)中

注意:

a.不允许使用AX、CX、DX存放EA,例如:mov ax,[cx]是错误的

b.SRC与DST的字长必须一致

c.如果使用BP基址寄存器,则段为SS(堆载段)

寄存器相对寻址方式:在寄存器间接寻址方式上添加了一个8/16位的偏移量

注意:mov ax,count[si]=mov ax,[count+si]

基址变址寻址方式:基址+变址

注意:必须是一个基址寄存器与一个变址寄存器的组合

相对基址变址寻址方式:在基址变址寻址方式中添加一个8/16位的偏移量

注意:mov ax,mask[bx][si]=mov ax,mask[bx+si]=mov ax,[mask+bx+si]

续-实例代码+表格

data segment
x db 01,02
y db ?,?
z db ?,?
w dw 1234h
data ends
code segment
  main proc far
    assume cs:code,ds:data
      start:
            push ds
            xor ax,ax
            push ax
            mov ax,data
            mov ds,ax
            mov dx,1234h             -----无有效地址
         mov cl,ds:[0000h]        -----0000h

            mov si,0000h
            mov di,0002h
            mov al,[si]               ----0000h 
            mov [di],al               ----无有效地址
            add si,1
            add di,1
            mov al,[si]
            mov [di],al

            mov si,0000h
            mov di,0000h
            mov al,x[si]
            mov y[di],al
            add si,1
            add di,1
            mov al,x[si]            -----0001h
            mov y[di],al

            mov si,0000h
            mov di,0000h
            mov bx,0000h
            mov bp,0004h
            mov al,[bx][si]          ----0000h
            mov ds:[bp][di],al
            add si,1
            add di,1
            mov al,[bx][si]
            mov ds:[bp][di],al
            ret
  main endp
code ends
end start

指令 寻址方式 有效地址
MOV DX,1234H 立即寻址方式
MOV CL,DS:[0000H] 直接寻址方式 0000H
MOV AL,[SI] 寄存器间接寻址方式 0000H
MOV [DL],AL 寄存器寻址方式
MOV AL,X[SI] 寄存器相对寻址方式 0001H
MOV AL,[BX][SI] 基址变址寻址方式 0000H