对内存的寻址方式
形式 | 名称 | 特点 | 意义 | 示例 |
---|
[idata] | 直接寻址 | 用一个常量/立即数来表示地址 | 用于直接定位一个内存单元 | mov ax,[200] |
[bx] | 寄存器间接寻址 | 用一个变量来表示内存地址 | 用于间接定位一个内存单元 | mov bx,0 mov ax, [bx] |
[bx+idata] | 寄存器相对寻址 | 用一个变量和常量表示地址 | 可在一个起始地址的基础上用变量间接定位一个内存单元 | mov bx, 4 mov ax, [bx+200] |
[bx+si] | 基址变址寻址 | 用两个变量表示地址 | | mov ax,[bx+si] |
[bx+si+idata] | 相对基址变址寻址 | 用两个变量和一个常量表示地址 | | mov ax, [bx+si+200] |
二重循环问题的处理方法
- 问题:编程将datasg段中每个单词改为大写字母。
assume cs:codesg,ds:datasg
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
datasg ends
codesg segment
start:
;有缺陷的程序(共用cx会出现问题)
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
sO:mov si,0
mov cx,3
s:mov al,[bx+si]
and al,11011111b
mov[bx+si],al
inc si
loop s
add bx,16
loop s0
codesg ends
end start
法1用寄存器dx保存数据
assume cs:codesg,ds:datasg
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s0:mov dx,cx;将外层循环的cx值保存在dx中
mov si,0
mov cx,3;cx设置为内存循环的次数
s:mov al,[bx+si]
and al,11011111b
mov [bx+si],al
inc si
loop s
add bx,16
mov cx,dx;用dx中存放的外层循环的计数值恢复cx
loop s0;(cx)=(cx)-1针对外层循环
codesg ends
end start
法2用固定的内存空间保存数据
assume cs:codesg,ds:datasg
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s0:mov ds:[40H],cx;将外层循环的c值保存在datasg:40H单元中
mov si,0
mov cx,3;cx设置为内存循环的次数
s:mov al,[bx+si]
and al,11011111b
mov [bx+si],al
inc si
loop s
add bx,16
mov cx,ds:[40H];用datasg:40H单元中的值恢复cx
loop s0;
codesg ends
end start
法3用栈保存数据
assume cs:codesg,ds:datasg
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
datasg ends
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
codesg segment
start:
mov ax,stacksg
mov ss,ax
mov sp,16
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s0:push cx;将外层循环的cx值压栈
mov si,0
mov cx,3;cx设置为内存循环的次数
s:mov al,[bx+si]
and al,11011111b
mov [bx+si],al
inc si
loop s
add bx,16
pop cx;从栈顶弹出原cx的值,恢复cx
loop s0
codesg ends
end start