不同寻址方式的总结
- [idata]用一个常量来表示地址,可用于直接定位一个内存单元;
- [bx]用一个常量来表示内存地址,可用于间接定位一个内存单元;
- [bx+idata]用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元;
- [bx+si]用两个变量表示地址;
- [bx+si+idata]用两个变量和一个常量表示地址。
问题7.6
编程,将datasg段中每个单词的头一个字母改变为大写字母
assume cs:codesg,ds:datasg
datasg segment
db '1. file '
db '2. edit '
db '3. search '
db '4. view '
db '5. options '
db '6. help '
datasg ends
codesg segment
start:
codesg ends
end start
源程序
assume cs:codesg,ds:datasg
datasg segment
db '1. file '
db '2. edit '
db '3. search '
db '4. view '
db '5. options '
db '6. help '
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov cx,6
mov bx,0
mov si,0
mov dx,0
s:
mov dl,[bx + si + 3] ;这里操作的是字节,借助dl保存
and dl,11011111B
mov [bx + si + 3],dl
add si,10h
loop s
mov ax,4c00h
int 21h
codesg ends
end start
debug执行结果
结果与目标一致
问题
其实不需要si与dl,只需要ax、bx与idata就可以了
问题7.7
编程,将datasg段中每个单词改为大写字母
assume cs:codesg,ds:datasg
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
datasg ends
codesg segment
start:
codesg ends
end start
分析
本题的难点在于在只有cx一个循环计数器的情况下如何实现双重循环。这里可以把cx中的值暂时保存在内存中再取出
源程序
assume cs:codesg,ds:datasg
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
dw 0
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov bx,0 ;行
mov cx,4
s:
mov ds:[40h],cx
mov si,0 ;列
mov cx,3
s0:
mov al,[bx+si]
and al,11011111b
mov [bx+si],al
inc si
loop s0
add bx,10h
mov cx,ds:[40h]
loop s
mov ax,4c00h
int 21h
codesg ends
end start
debug
结果与目标一致
一般来说,在需要暂存数据的时候,我们都应该使用栈