定位内存地址的方法(也称为寻址方式)
寻址方式的适当应用,使我们可以以更合理的结构来看待所要处理的数据,而为所要处理的看似杂乱的数据设计一个清晰的数据结构是程序设计的一个关键的问题
《汇编语言》第三版 160页
[idata] 常量表示地址,直接定位
[bx] 变量表示地址,间接定位
[bx+idata] 变量和常量,起始地址用变量间接定位
[bx+si]
[bx+si+idata]
问题7.6 : 编程,将dataseg段中的每个单词的头一个字母改为大写字母
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 bx,0
mov cx,6
s: mov al,[bx+3]
and al,11011111B
mov [bx+3],al
add bx,10H
loop s
mov ax,4c00H
int 21H
codesg ends
end start
- 首字母都在 第3个字符(从第0个开始数) ,使用 [bx+idata] 定位, idata=3
问题7.7 & 问题7.8:将段中的每个单词改为大写字母
assume cs:codesg,ds:datasg,ss:stacksg
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
mov si,0
mov cx,3
s: mov al,[bx+si]
and al,11011111B
mov [bx+si],al
inc si
loop s
add bx,10H
pop cx
loop s0
mov ax,4c00H
int 21H
codesg ends
end start
- 需要暂存数据的时候,都应该使用 栈
- 栈顶偏移地址SP=8X2 计算,复习见 https://www.jianshu.com/p/03a175e6451a
-
双层循环,外层的循环次数cx的内容 压入 栈 保存,
push cx
- 完成一次外层循环,弹出cx的内容,
pop cx
如果不保存外层循环次数,程序会无限LOOP
- 不保存的情况下,可以使用
【debug T命令】
单步执行,并且可以在内层使用【debug P命令】
跳过内层循环 - 虽然程序可以完成全部字母大写的任务,但是程序会一直执行,此时对外层无法使用
【debug P命令】
跳过外层循环,也无法使用【debug g命令】
一口气执行完全部指令,具体表现为光标一直闪烁,但是debug程序没有反应
问题7.9:将前四个字母改写成大写
assume cs:codesg,ds:datasg,ss:stacksg
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
db '1. display '
db '2. brows '
db '3. replace '
db '4. modify '
datasg 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
mov si,0
mov cx,4
s: mov al,[bx+3+si]
and al,11011111B
mov [bx+3+si],al
inc si
loop s
add bx,10H
pop cx
loop s0
mov ax,4c00H
![dataseg中数据的存储结构.png](https://upload-images.jianshu.io/upload_images/10191360-7c87ee5c22a1418f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
int 21H
codesg ends
end start
- 将前4个字母改为大写,相对dx的起始地址就是3,一共连续4个字母,通过si来遍历
-
mov al,[bx+3+si]
,mov [bx+3+si],al
用于寻址