第七章:更灵活的定位内存地址的方法05

让编程改变世界

Change the world by program


问题7.8

[codesyntax lang="asm"]

assume cs:codesg,ds:datasg
datasg segment
db 'ibm             '
db 'dec             '
db 'dos             '
db 'vax             '
datasg endscodesg segment
start: mov ax,datasgmov ds,axmov bx,0mov cx,4s0: mov si,0mov cx,3s: mov al,[bx+si]and al,11011111bmov [bx+si],alinc siloop sadd bx,16loop s0mov ax,4c00hint 21h
codesg ends
end start

[/codesyntax] 仔细阅读上面的程序,看看有什么问题? 思考后请听小甲鱼分析!

问题7.8分析

问题在于cx的使用,我们进行二重循环,却只用了一个循环计数器,造成在进行内层的时候覆盖了外层循环的循环计数值。 多用一个计数器又不可能,因为loop指令默认cx为循环计数器。 怎么办呢?   我们应该在每次开始内层循环的时候,将外层循环的cx中的数值保存起来,在执行外层循环的loop指令前,再恢复外层循环的cx数值。 我们可以用寄存器dx来临时保存cx中的数值。 看看我们改进后的程序(下载源代码)   上面的程序用dx来暂时存放cx中的值。如果在内层循环中,dx寄存器也被使用,该怎么办? 我们似乎可以使用别的寄存器,但是CPU中的寄存器数量毕竟是有限的,如8086CPU只有14个寄存器。 在上面的程序中:

si、cx、ax、bx,显然不能用来暂存cx中的值,因为这些寄存器在循环中也要使用;

cs、ip、ds也不能用,因为cs:ip时刻指向当前指令,ds指向datasg段;

可用的就只有:dx、di、es、ss、sp、bp等6个寄存器了。   可是如果循环中的程序比较复杂,这些寄存器也都被使用的话,那么该如何? 我们在这里讨论的问题是,程序中经常需要进行数据的暂存,我们怎样做将更为合理。 这些数据可能是寄存器中的,也可能是内存中的。 我们可以用寄存器暂存它们,但是这不是一个一般化的解决方案,因为寄存器的数量有限,每个程序中可使用的寄存器都不一样。   我们希望寻找一个通用的方案,来解决这种在编程中经常会出现的问题。 显然,我们不能选择寄存器,那么可以使用的就是内存了。 我们可以考虑将需要暂存的数据放到内存单元中,需要使用的时候,再从内存单元中恢复。这样我们就需要开辟一段内存空间。 一起来看再次改进的程序(下载源代码)   改造后的程序中,用内存单元来保存数据。可是上面的作法却有些麻烦,因为如果需要保存多个数据的时候,读者必须要记住数据放到了哪个单元中,这样程序容易混乱。 我们使用内存来暂存数据,这一点是确定了的,但是值得推敲的是,我们用怎样的结构来保存这些数据,而使得我们的程序更加清晰,更容易读懂和被接受?

我们来参考VC编译器的做法!

一般来说,在需要暂存数据的时候,我们都应该使用栈,回忆一下,栈空间在内存中,采用相关的指令,如:push、pop等,可对其进行特殊的操作。 我们将再次改进我们的程序 !(下载源代码) [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LVXVYMZRPZLE']视频下载[/Downlink]

转载于:https://www.cnblogs.com/LoveFishC/archive/2010/12/24/3846015.html

更灵活的定位内存地址的方法05 - 零基础入门学习汇编语言36相关推荐

  1. 更灵活的定位内存地址的方法02 - 零基础入门学习汇编语言33

    第七章:更灵活的定位内存地址的方法02 让编程改变世界 Change the world by program [bx+idata] 在前面,我们可以用[bx]的方式来指明一个内存单元, 我们还可以用 ...

  2. 更灵活的定位内存地址的方法---汇编学习笔记

    更灵活的定位内存地址的方法 前面,我们用[0].[bx]的方法,在访问内存的指令中,定位内存单元的地址.本章将用更灵活的方式来定位内存地址. 7.1 and和or指令 (1)and指令:逻辑与指令,按 ...

  3. 汇编: 更灵活的定位内存地址的方法

    bx是偏移地址寄存器.同样的, si,di也是偏移地址寄存器. 这样使用了si,di可以更灵活的定位内存地址. assume cs:codecode segmentstart: mov bx,0mov ...

  4. [汇编语言]更灵活的定位内存地址的方法

    目录 一.and和or指令 二.以字符的形式给出数据 三.大小写转化问题 四.[bx+idata] 五.SI和DI 六.[bx+si]和[bx+di] 与 [bx+si+idata]和[bx+di+i ...

  5. (七)汇编语言——更灵活的定位内存地址的方法

    目录 and和or ASCII码 [bx+idata] SI和DI寄存器 [bx+si]和[bx+di] [bx+si+idata]和[bx+di+idata] 总结 例子(双重循环的解决方案) 我们 ...

  6. 王爽 汇编语言第三版 第7章 --- 更灵活的定位内存地址的方法(可以理解为 数组形式的内存定位)

    汇编语言(第三版)王爽著 的十二个实验:https://blog.csdn.net/OrangeHap/article/details/89791064 大小端 字节对齐 对于 arm,intel 这 ...

  7. 《汇编语言》总结04 —— 更灵活的定位内存地址的方法

    (一)and和or指令 and指令:逻辑与指令,按位进行与运算 mov al,01100011B and al,00111011B 执行后,al=00100011B 作用:通过该指令可将操作对象的相应 ...

  8. 汇编语言-王爽 第7章 更灵活的定位内存地址的方法-笔记

    将datasg中的第一个字符串转化为大写,第二个字符串转化为小写. 第一种方法: assume cs:codesg,ds:datasgdatasg segmentdb 'BaSic'db 'iNfOr ...

  9. 汇编语言-更灵活的定位内存地址的方法

    目录 一.and和or指令 1.补充知识: 2.and指令 3.or指令 二.以字符的形式给出的数据 三.大小写转换 ACSII码值对照表: 一.and和or指令 1.补充知识: 与运算(&) ...

最新文章

  1. 为什么C++(感谢waterwalk翻译)
  2. 「基本功」不可不说的Java“锁”事
  3. 云点播网页版_微软宣布:免费开放微软云办公、云桌面、云远程方案
  4. 微信小程序————经纬度转化为具体位置(逆地址解析)
  5. 递归 将一个整数逆序
  6. 原型继承+原型链 + 对象继承发展
  7. Canvas制作动态进度加载水球
  8. ffempge 效率 生成_ffmpeg 编译静态库,搞了好久,终于搞成功了.根据网上教程做的 · iodefog...
  9. Idea设置多开窗口
  10. 马斯克回应停工事件:Model 3周产量将达6000辆,不开玩笑哦
  11. ionic/cordova即时通讯解决方案(上)
  12. 拓端tecdat|视频:R语言中的时间序列分析模型:ARIMA-ARCH / GARCH模型分析股票价格
  13. html标记详解博客,HTML表格标记详解8:表格嵌套
  14. oracle库导出,oracle整库导出
  15. mysql如何导入mdl文件_将sql文件导入PowerDesigner中的方法(将oracle sql文件转换成mysql)...
  16. CCPC-wannafly Camp Day2 讲课内容总结(杜瑜皓-数据结构)
  17. 配电室智能辅助控制系统
  18. java中赛场统分的情况
  19. 电脑如何接受邮件服务器,什么是传入邮件服务器?
  20. 几个免费好用的IP查询接口

热门文章

  1. 兼容性测试之VMware
  2. jquery 请求jsp传递json数据的方法
  3. 组播、IGMP、IGMP Snooping
  4. AS3的Number类型变量不指定初始值,则其初始值为NaN,而不是0.0
  5. 如何提高.NET的性能 ?
  6. 360私有云平台-HULK 5岁啦~
  7. 前后端分离后 前端获得session数据_机器学习模型部署--打通前后端任督二脉
  8. 收获,不止SQL优化——抓住SQL的本质--第二章
  9. el-cascader超出屏幕问题
  10. Java 并发编程CyclicBarrier的应用与源码解析(基于ReentrantLock实现)