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

第七章:更灵活的定位内存地址的方法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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nextgaussian_Java Random nextGaussian()方法与示例

nextgaussian随机类nextGaussian()方法 (Random Class nextGaussian() method) nextGaussian() method is available in java.util package. nextGaussian()方法在java.util包中可用。 nextGaussian() method is used to generate the next pseudo-random Gaussian double valu…

Java PriorityQueue clear()方法与示例

PriorityQueue类clear()方法 (PriorityQueue Class clear() method) clear() method is available in java.util package. clear()方法在java.util包中可用。 clear() method is used to remove all the objects from this PriorityQueue. clear()方法用于从此PriorityQueue中删…

图像分割-边缘连接

三种基本方法: 1:局部处理 2:区域处理 3:使用霍夫变换的全局处理 局部处理 根据预定的规则,将所有相似点连接起来。 用于确定边缘像素相似性的两个主要性质:1、梯度向量的幅度2、梯度向量的角度 由于要…

01-图像ROI区域获取

截取部分图像数据 import cv2 def cv_show(name,img):cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()img2 cv2.imread("E:\Jupyter_workspace\study\data/cat.png")#读取照片,第二个参数若为0,则灰度图;若不填或者1…

如何编写测试计划

有以下几个方面需要作考虑: 1. 测试的范围。要测试什么,这是肯定要明确的,即使你知道,你也要写出来,让看这份文档的人知道测试的范围。在确定测试内容的时候,还可以做一个优先级的区分,这样能保…

java clone 序列化_关于Java对象深度Clone以及序列化与反序列化的使用

‍ 我们可以利用clone方法来实现对象只见的复制,但对于比较复杂的对象(比如对象中包含其他对象,其他对象又包含别的对象.....)这样我们必须进行层层深度clone,每个对象需要实现 cloneable接口,比较麻烦,那就继续…

java enummap_Java EnumMap containsKey()方法与示例

java enummapEnumMap类containsKey()方法 (EnumMap Class containsKey() method) containsKey() method is available in java.util package. containsKey()方法在java.util包中可用。 containsKey() method is used to check whether this map has values for the given key e…

02-对图像进行边界填充

import cv2 import matplotlib.pyplot as pltimg2 cv2.imread("E:\Jupyter_workspace\study\data/cat.png")#读取照片,第二个参数若为0,则灰度图;若不填或者1则彩色图或本身图top_size,bottom_size,left_size,right_size (50,50,…

正则基础

http://www.ipc.me/regular_expression_07681.html文章错误: 1 字符集的一些应用 第二个正则少了一个左方括号。 2 字符集的元字符 /[]x]/中的第一个]左边少了一个转义符,在这种情况下转义符还是不能省略的。扩展 1 回车符 换行符 http://www.c…

Windows Phone 7独立存储空间IsolatedStorage

Windows Phone 7的solatedStorage可以用来保存应用程序的数据和设置。结构图如下 一、相关类 1.IsolatedStorageFile类 1)描述:表示在独立存储空间中的文件和目录。 2)重要属性 long AvailableFreeSpace:IsolatedStorage有效的剩余…

图像分割-阈值处理详解(迭代法、Otsu法、平滑改善法、边缘改进法、分块处理法、局部特性法、移动平均法)

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 阈值处理详解基础:基于全局的阈值处理1迭代算法(最小概率误…

java 用户控件_C#自定义控件VS用户控件

C#中自定义控件VS用户控件大比拼1 自定义控件与用户控件区别WinForm中,用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Controls控件自定义控件(Custom Control):继…

Java FileDescriptor sync()方法与示例

FileDescriptor类sync()方法 (FileDescriptor Class sync() method) sync() method is available in java.io package. sync()方法在java.io包中可用。 sync() method is used to synchronize all the system buffer with the underlying device. sync()方法用于将所有系统缓冲…

windows 7资源管理器崩溃解决方法

最近被频繁的资源管理器explorer崩溃搞得几乎生活不能处理,一打开带有视频的文件夹,就explorer崩溃,要疯了。 日志中含有mpc_mtcontrol.dll 查来查去,没有一个确定的答案,baidu,google都没用,最…

03-对图像进行数值计算和加权融合

数值计算 import cv2img_1 cv2.imread(E:\Jupyter_workspace\study\data/beyond.png) img_2 cv2.imread(E:\Jupyter_workspace\study\data/water2.png)img_1_1 img_1 10 img_1[:2,:,0]#输出前两行就行 img_1_1[:2,:,0]#[h,w,c] img_2[:2,:,0]#[h,w,c](img_1 img_2)[:2,:,…

SQL Server存储过程(procedure)应用

用户反映,系统操作日志会使用数据库快速增大,情况可参考下图, 问题分析,整个系统每个页面,都有写记录用户操作代码,修改或禁用这个代码,看来是不可能的。 在原有系统参数表添加一个选项&#xf…

Opencv一维直方图的绘制

下面是我参考《opencv3编程入门》写的绘制一维直方图的代码 using namespace cv; using namespace std; #define byte uchar #define TYEPE_GRAY 0 #define TYEPE_RGB 1 /*--------------------------绘制RGB三色一维直方图-------------------------------------*/ Mat My_R…

Java类class forName()方法及示例

类类forName()方法 (Class class forName() method) forName() method is available in java.lang package. forName()方法在java.lang包中可用。 forName() method is used to return the class object for the Class with the given class_name. forName()方法用于返回具有给…

04-图像的阈值操作

对图像的阈值操作 import cv2 import matplotlib.pyplot as pltimg cv2.imread(E:/Jupyter_workspace/study/data/cat.png,1) ret, thresh1 cv2.threshold(img,127,255,cv2.THRESH_BINARY) ret, thresh2 cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV) ret, thresh3 c…

java虚拟机内存监控_深入理解JVM虚拟机9:JVM监控工具与诊断实践

本文转自:https://juejin.im/post/59e6c1f26fb9a0451c397a8c本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h3pl/Java-Tutorial喜欢的话麻烦点下Star哈文章将同步到我的个人博客:…