第七章:更灵活的定位内存地址的方法04
让编程改变世界
Change the world by program
不同的寻址方式的灵活应用
如果我们比较一下前面用到的几种定位内存地址的方法(可称为寻址方式),就可以发现有以下几种方式:
(1)[iata] 用一个常量来表示地址,可用于直接定位一个内存单元; (2)[bx]用一个变量来表示内存地址,可用于间接定位一个内存单元; (3)[bx+idata] 用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元; (4)[bx+si]用两个变量表示地址; (5)[bx+si+idata] 用两个变量和一个常量表示地址。 可以看到: 从[idata]一直到[bx+si+idata],我们可以用更加灵活的方式来定位一个内存单元的地址。 这使我们可以从更加结构化的角度来看待所要处理的数据。 下面我们将通过一系列问题来体会CPU提供多种寻址方式的用意,并学习一些相关的编程技巧。 好了,大家要做好心理准备~问题7.6
编程,将datasg段中每个单词的头一个字母改为大写字母。
[codesyntax lang="asm"]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[/codesyntax]
问题7.6分析
datasg中的数据的存储结构,如图: [caption id="attachment_332" align="aligncenter" width="300"]![datasg中的数据的存储结](http://blog.fishc.com/wp-content/uploads/2012/07/119-300x163.gif)
BX先存放第一行的地址
mov cx,6;因为总共有六行
s: 改变第BX行,第3列的字母为大写改变BX的值是它指向下一行的地址
loop
我们用bx作变量,定位每行的起始地址,用3定位要修改的列,用[bx+idata]的方式来对目标单元进行寻址,请看视频具体演示!
问题7.7
编程:将datasg段中每个单词改为大写字母。
[codesyntax lang="asm"]assume cs:codesg,ds:datasg datasg segment db 'ibm ' db 'dec ' db 'dos ' db 'vax ' datasg ends codesg segment start: …… codesg ends end start[/codesyntax]
问题7.7分析
datasg中数据的存储结构,如图: [caption id="attachment_333" align="aligncenter" width="300"]![datasg中数据的存储结构](http://blog.fishc.com/wp-content/uploads/2012/07/213-300x119.gif)
R=第一行的地址;
mov cx,4
s0: C=第一列的地址
mov cx,3
s: 改变R 行,C列的字母为大写C=下一列的地址;
loop s
R=下一行的地址loop s0
我们用bx来作变量,定位每行的起始地址,用si 定位要修改的列,用 [bx+si] 的方式来对目标单元进行寻址, 请看程序完整代码!(下载地址) [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LNDFUHVCKSSC']视频下载[/Downlink]