第七章:更灵活的定位内存地址的方法06
让编程改变世界
Change the world by program
问题7.9
编程,将datasg段中每个单词的前四个字母改为大写字母:
[codesyntax lang="asm"]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: …… codesg ends end start[/codesyntax]
问题7.9分析
datasg中的数据的存储结构,如图:
[caption id="attachment_337" align="aligncenter" width="300"] datasg中的数据存储情况[/caption] 由于数据是连续存放的,我们可以将这4个字符串看成一个4行16列的二维数组,按照要求,我们需要修改每个单词的前四个字母,即二维数组的每一行的3~6列。 我们需要进行4x4次的二重循环,用变量R定位行,常量3定位每行要修改的起始列,变量C定位相对于起始列的要修改的列。其实这个题也就是将前边的三个题目给“总结”概括了一下!
我们首先用R定位第1行,循环修改R行的3+C( 0≤C≤3 )列
然后再用R 定位到下一行,再次循环修改R行的3+C(0≤C≤3)列
如此重复直到所有的数据修改完毕。
处理的过程大致如下:
R=第一行的地址;
mov cx,4
s0: C=第一个要修改的列相对于起始列的地址mov cx,4
s: 改变R行,3+C列的字母为大写C=下一个要修改的列相对于起始列的地址
loop s
R=下一行的地址
loop s0
我们用bx来作变量,定位每行的起始地址,用 si定位要修改的列,用 [ bx+3+si ]的方式来对目标单元进行寻址。 请在实验中白己完成这个程序。小结
这一章中,我们主要讲解了更灵活的寻址方式的应用和一些编程方法,主要内容有:寻址方式
[bx(或si、di)+idata]、
[bx+si(或di)]、
[bx+si(或di)+idata]的意义和应用;