汇编语言:七、[BX]和loop指令

[bx]

[bx]表示一个内存单元,它的偏移地址在bx中

()

(ax)表示寄存器ax中的内容

inc ax

ax中的内容+1

loop指令

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)

指出当前程序使用附加数据段的段基址,该段是串操作指令中目的串所在的段。

你可能感兴趣的:(汇编语言:七、[BX]和loop指令)