十三、直接、寄存器间接寻址、寄存器相对寻址、基址变址寻址、相对基址变址寻址
计算机只容许使用bx、si、di、bp寄存器做间接和相对寻址其中bx为基址存储器,si、di为变址存储器 内存寻址方式:确定访问内存存储单元偏移地址的方式称为寻址方式。直接寻址:[偏移地址]寄存器间接寻址:[基址寄存器/变址寄存器]寄存器相对寻址:[基址寄存器/变址寄存器+偏移量值]基址变址寻址:[基址寄存器+变址寄存器]相对基址变址寻址:[基址寄存器+变址寄存器+...
·
计算机只容许使用bx、si、di、bp寄存器做间接和相对寻址
其中bx为基址存储器,si、di为变址存储器
内存寻址方式:确定访问内存存储单元偏移地址的方式称为寻址方式。
直接寻址:[偏移地址]
寄存器间接寻址:[基址寄存器/变址寄存器]
寄存器相对寻址:[基址寄存器/变址寄存器+偏移量值]
基址变址寻址:[基址寄存器+变址寄存器]
相对基址变址寻址:[基址寄存器+变址寄存器+偏移量值]
注意:
a 格式上的注意,正确区分寻址方式
b 五种寻址中,均可以使用段前缀 //ds:[0001H]
c masm编译器编译时,代码中的直接寻址必须采用段前缀的形式
指针寄存器包括堆栈寄存器SP(stack pointer)和基数指针寄存器BP(base pointer),变值寄存器包括源变址寄存器SI(source index)和目的变值寄存器DI(destination index)。这4个寄存器都是16位寄存器,这些寄存器在运算过程中也可以用来存放操作数(只能以字为单位),但经常的用途是在段内寻址时提供偏移地址,SP,BP一般与段寄存器SS联用,以确定堆栈寄存器中某一单元的地址,SP用以指示栈顶的偏移地址,而BP可作为堆栈区中的一个基地址,用以确定在堆栈中的操作数地址。SI,DI一般与段寄存器DS联用,以确定数据段中某一存储单元的地址,SI,DI具有自动增量和自动减量的功能,这一点使在串操作指令中用做变址非常方便,SI作为隐含的源变址DS联用,DI作为隐含的目的变址和ES连用,从而达到在数据段和附加段中寻址的目的。
BX+SI
BX+DI
BP+SI
BP+DI
1. 直接寻址
偏移地址值直接出现在执行代码中。
mov 寄存器,[偏移地址]
mov [偏移地址],寄存器
2. 寄存器间接寻址
偏移地址通过寄存器取得使用
mov 寄存器,[寄存器]
mov [寄存器],寄存器
实例:
assume cs:daima
daima segment
mov ax,2000H
mov ds,ax
mov ax,1122H
mov cx,3344H
mov bx,0000H
mov [bx],ax ;将ax值放入ds 2000:0000
mov bx,0002H
mov [bx],cx ;将cx值放入ds 2000:0002
mov ax,4c00H
int 21H
daima ends
end
3. 寄存器相对寻址
偏移地址值通过[寄存器+偏移量值]的形式运算后获得。
mov 寄存器,[寄存器+偏移量值]
mov 寄存器,ds:[寄存器+偏移量值]
mov [寄存器+偏移量值],寄存器
mov ds:[寄存器+偏移量值],寄存器
实例1:
assume cs:code,ds:data
data segment
db 'abc'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0000H
mov ah,[bx+0000H]
mov al,[bx+0001H]
mov ax,4c00H
int 21H
code ends
end start
实例2:
;交换ds中偏移地址1和4,2和5,3和6的数据
assume cs:code,ds:data
data segment
db 'abcdef'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0000H
mov cx,3
A:
mov ah,ds:[bx]
mov al,ds:[bx+0003H]
mov [bx+0003H],ah
mov [bx],al
inc bx
loop A
mov ax,4c00H
int 21H
code ends
end start
实例3:
assume cs:code,ds:data
data segment
db 'abc'
db 0H,0H,0H
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0000H
mov di,0003H
mov cx,3
A:
mov ah,[si]
mov [di],ah
inc si
inc di
loop A
mov ax,4c00H
int 21H
code ends
end start
4. 基址变址寻址方式
偏移地址值通过[基址寄存器+变址存储器]的形式运算后获得。
格式:
mov 寄存器,[基址寄存器+变址寄存器]
mov [基址寄存器+变址寄存器],寄存器
例如:
mov ax,[bx+si]
mov ax.[bx+di]
;不可以这样
mov ax,[si+di]
实例:
;累计相加偏移地址0002H 3次。
assume cs:code,ds:data
data segment
db 1H,1H,2H
data ends
code segment
start:
mov ax,data
mov ds,ax
mov ah,00H
mov bx,0000H
mov si,0002H
mov cx.3
A:
mov al,[bx+si]
add ah,al
inc bx
dec si
loop A
mov ax,4c00H
int 21H
code ends
end start
5. 相对基址变址寻址
偏移地址值通过[基址寄存器+变址寄存器+偏移量值]的形式运算后获得。
格式:
mov 寄存器,[基址寄存器+变址寄存器+偏移量值]
mov [基址寄存器+变址寄存器+偏移量值],寄存器
实例:
;取出1H、3H放入ah、al
assume cs:code,ds:data
data segment
db 0H,0H,0H,1H,2H,3H
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0000H
mov si,0001H
mov ah,[bx+si+0002H]
mov di,0003H
mov al,[bx+di+0002H]
mov ax,4c00H
int 21H
code ends
end start
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献6条内容
所有评论(0)