【汇编】BX和loop指令——debug和汇编编译器Masm对指令的不同处理及解决方法、[bx]累加的两个问题、段前缀、内存中的安全空间

5.4 debug和汇编编译器Masm对指令的不同处理

在之前探讨过在debug中和在汇编中对指令的不同处理,即mov ax,[0]对于masm来说是将0这个数值传给ax,而debug中是将[0]偏移地址中的数值传递给ax。
在这里插入图片描述
如果一定要像debug中处理汇编的指令的话可以使用段地址配合偏移地址的方式来使用。

  • debug中:mov ax,[0]
  • MASM中::mov ax,ds:[0]

如下图,可以看到这样masm和debug的执行结果就相同了。
在这里插入图片描述
在这里插入图片描述

5.5 loop和[bx]的联合应用

累加的两个问题

在计算所有数据的和是,我们要确定当前数值是否超过该寄存器所能存储的范围,即小于等于65535
且我们不能在累加单元的时候直接将所有数值直接放入寄存器中因为存储单元中是字节为单位,而在寄存器中是以字为单位的。

那我们怎么解决这两个问题呢?
我们可以使用一个中介寄存器ax来存储相应累加的值,来使两个寄存器中的运算对象匹配且不容易超界。

以下我们要实现一个程序,即把ffff0h-ffffbh中的数值复制到ds:[X]的连续内存单元中。
我们可以用循环来实现。
自己实现下,实现后再看下面代码。
在这里插入图片描述

5.6 段前缀

在mov ax,[bx]中内存单元的偏移地址由bx给出,而段地址默认在ds中。
在之前我们学习过的访问内存单元的指令中,用于致命内存单元的段地址的“ds:”、“cs:”、“ss:”、“es:”,在汇编中称为段前缀。

5.7 一段安全的空间

在内存中我们不能去随意的改变内存当中的内容,因为他在不同的内存空间中肯定是有不同的作用。若随意修改容易造成部分功能无法工作。那有没有一个空闲安全的空间供我们使用呢?
在0::200——0:2FF的256个字节的空间,这段空间是安全的。

当然现在我们调试和使用的过程中,可以使用vscode的集成化环境或者用dosbox和masm联合使用,可以明显的解决这个问题。

以下我们要实现一个程序,即把ffff0h-ffffbh中的数值复制到0:200~0:20b的连续内存单元中。

在这里插入图片描述
但是上面内容来看,一次程序需要设置ds两次。这样会对效率有很大的影响。
所以我们可以使用两个段寄存器分别存放ffff:x和0020:x的段地址,即可省略需要重复做12次的设置ds的程序段。
类似于C++中的双指针
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

webfker from 0 to 1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值