(1)将课程中所有讲解过的程序上机调试,用 Debug 跟踪其执行过程,并在过程中进一步理解所讲内容。
由于该部分内容书上已经详细讲解,故不再赘述
(2)编程,完成问题 7.9 中的程序
问题7.9
编程,将datasg段中每个单词的前四个字母改为大写字母。
assume cs:codesg,ss:stacksg,ds:datasg
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:
————————————————
codesg ends
end start
datasg中的数据的存储的结构,如下图所示。
datasg中定义了4个字符串,每个长度为16字节,因为他们是连续存放的,我们可以将这4个字符串看成一个4行16列的二维数组,按照要求,我们需要修改每个单词的前4个字母,即二维数组的每一行的3~6列。
我们需要进行 4x4 次的二重循环,用变量列R定位行,常量3定位每行要修改的起始列,变量 C 定位相对于起始列的要修改的列。外层循环按行来进行,内层循环按列来进行。我们首先用R定位第1行,循环修改 R 行的 3+C ( 0<=C<=3)列;然后再用 R 定位到下一行,再次循环修改 R 行的 3+C ( 0<=C<=3)列.....,如此重复直到所有的数据修改完毕。处理的过程大致如下:
我们用bx来做变量,定位每行的起始地址,用si定位要修改的列,用[bx+3+si]的方式来对目标单元进行寻址。
具体汇编代码如下:
assume cs:codesg,ss:stacksg,ds:datasg
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
s1:
mov al,[bx+si+3] ;将每行的前四个字母(每个字母占8位)放入寄存器中进行与操作
and al,11011111b
mov [bx+si+3],al
inc si
loop s1
add bx,16 ;将当前位置换到下一行上(一行字符串长度占16个字节)
pop cx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
实验结果:
可以观察到,每行字符串前4个字母变为了大写。