[bx]
[bx]表示一个内存单元,它的偏移地址在bx中
()
(ax)表示寄存器ax中的内容
inc ax
ax中的内容+1
loop指令
loop的功能:实现循环
用法:如上图,执行loop s语句时,执行以下操作
①cpu执行(cx)=(cx)-1
②判断(cx)是否为0,如果为零,往下执行代码,如果不为零,回到标志地点s再次循环运行。
在debug中跟踪用loop指令实现循环程序
考虑一个问题:
计算ffff:006单元中的数乘以3,结果存储在dx中
问:
①结果是否会超过dx的存储范围
答:不会,一个存储单元有八个位,数的范围在0-255之间,用它乘3不会超过65535(2^16=65536)
②用循环累加实现乘法,用哪个寄存器?
将ffff:6单元中的数值赋给ax,用dx进行累加。先设(dx)=0,如何计算三次(dx)=(dx)+(ax)
③ffff:6单元是一个字节单元,ax是一个16位寄存器,数据的长度不一样,如何赋值?
赋值是指数据的值大小相等,虽然它们的数据长度不一样,但是大小是相等的
对以上问题进行汇编
注意:在汇编源程序中,数据不能以字母开头,以字母开头的数据要在前面加0
用debug进行追踪
debug和汇编编译器masm对指令的不同处理
debug对形如 mov ax,[0] 等指令的解释和masm有所不同
debug将[idata]解释为一个内存单元
但masm将其解释为idata
如何解决这个问题
将偏移地址送入bx寄存器,用[bx]的方式来访问内存单元
loop和[bx]的联合使用
考虑一个问题
计算ffff:0~ffff:b单元中的数据和结果存储在dx中
①能否将ffff:0·ffff:b中的数据直接累加到dx中
答:不行,因为ffff:0~ffff:b中的数据是8位的,不能直接加到16位的寄存器中
②能否将数据累加到dl中,从而实现累加到dx中?
答:不行,超过范围
段前缀
如指令 mov ax,cs:[0] ,访问内存单元指令中,用于显式地指明内存单元的段地址,‘ds:’,‘cs:’,‘ss:’,‘es:’,在汇编语言中称为段前缀
一段安全空间
如果向放有重要数据的内存中写入数据,可能会引发错误,DOS方式下,一般情况,0:200~0:2ff空间没有系统或其他程序的重要数据代码,可以在 其中写入数据。
段前缀的使用
问题:将内存ffff:0~ffffb单元中的数据复制到0:200~0:20b单元中
代码如下:
es寄存器
附加段寄存器ES(Extra Segment)
指出当前程序使用附加数据段的段基址,该段是串操作指令中目的串所在的段。