汇编中的变址寄存器,指的是
- si ==》 源变址寄存器
- di ==》 目标变址寄存器
变址寄存器实例
例如,使用si和di进行字符串的复制
首先使用ds:si指向要复制的原始字符串,用ds:di指向复制的目的空间,并使用一个循环完成复制
data segment
db 'abcddcba'
data ends
code segment
assume cs:code, ds:data
start:
mov ax, data
mov ds, ax ; 把ds指向data
mov si, 0 ; 源字符串起始0
mov di, 8 ; 目标字符串起始8
mov cx, 8 ; 循环8次
s:
mov al, [si]
mov [di], al
inc si
inc di
loop s
mov ax, 24H
mov ds:[16], ax ; 结束标记为$,ASCII为24h
lea dx, ds:[0]
mov ah, 9h
int 21h
mov ax, 4c00h
int 21h
code ends
end start
在这里, si和di是两个辅助的寄存器,可以让代码看起来更清晰
在相对寻址时,不单可以[bx],还可以[bx+idata],以及
- [bx+si]
- [bx+si+idata]
这里的idata表示常量,[bx+idata]表示寄存器+常量,而[bx+si]表示两个寄存器,最后一个表示寄存器+寄存器+常量方式进行变址寻址
这里的bx,不能换为ax,而si可以换为di,因为通用寄存器中相对寻址仅能bx,而si和di均为变址寄存器,另外还可以使用的有bp寄存器,明确不能用的ax, cx, dx, ds, 而能使用的组合寄存器则仅有以下4个,否则也会报错
- bx 和 si
- bx 和 di
- bp 和 si
- bp 和 di
bp不指定寄存器时,默认跟着ss,而不是ds