第五章 [BX]和loop指令
1.[bx]和内存单元的描述
完整地描述一个内存单元:①内存单元的地址;②内存单元的长度(类型)
[bx]同样也表示一个内存单元,它的偏移地址在bx中。比如:
**mov ax,[bx]**
将一个内存单元的内容送入ax,这个内存单元长度为2字节,存放一个字,偏移地址在bx中,段地址在ds中。
2.loop
loop这个指令与循环有关。
3.我们定义的描述性的符号:“()”
为了描述的简介,用“()”来表示一个寄存器或一个内存单元中的内容。
“()”的元素可以为:①寄存器名;②段寄存器名;③内存单元的物理地址(一个20位数据)
“(X)”所表示的数据有两种类型:①字节;②字。是哪种类型由寄存器或具体的运算决定。
4.约定符号idata表示常量
指令中,在“[...]”里用一个常量0表示内存单元的偏移地址。以后我们用idata表示常量。比如:
mov ax,[idata]就代表 mov ax,[1]、mov ax,[2]、mov ax,[3]等。
mov bx,idata就代表mov bx,1、mov bx,2、mov bx,3等。
[BX]
mov ax,[bx]:
(ax) = ((ds)*16+(bx))
mov [bx],ax:
((ds)*16+(bx)) = (ax)
**注意:内存中,越往下,越高位**
Loop指令
loop指令的格式是:loop 标号,CPU执行loop指令的时候,要进行两步操作:
①(cx)=(cx)- 1;
②判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。
例:计算2^12
assume cs:code
code segment
mov ax,2
mov cx,11
s: add ax,ax
loop s
mov ax,4c00h
int 21h
code ends
end
总结:
(1)在cx中存放循环次数;
(2)loop指令中的标号所标识地址要在前面;
(3)要循环执行的程序段,要写在标号和loop指令的中间。
在Debug中跟踪用loop指令实现的循环程序。
在汇编源程序中,数据不能以字母开头
打开Debug开始调试
当我们不想一步一步跟踪前面的程序,希望一次能够执行,然后从循环开始跟踪,可以使用G命令:
当想直接将循环直接运行完跳到循环下一个语句时,可以在遇到循环loop时用p指令:
Debug和汇编编译器masm对指令的不同处理
对于这条指令:
mov ax,[0]
在Debug中处理是:mov ax,ds:0000
在masm中处理时: mov ax,0
所以在masm中要用bx来代替直接使用数值的偏移地址
因此在masm中实现 mov ax,[0]
方法一:mov bx,0 mov ax,[bx]
方法二:mov ax,ds:[0]
loop和[bx]的联合应用
在实际编程中,用loop和[bx]来解决处理地址连续的内存单元中的数据问题。
段前缀
mov ax,ds:[bx]
mov ax,cs:[bx]
mov ax,ss:[bx]
mov ax,es:[bx]
mov ax,ss:[bx]
mov ax,cs:[0]
mov ax,ds:[0]
以上的“ds:” “cs:” “ss:” “es:” 称为段前缀
一段安全的空间
简单来说,汇编是对实际的硬件的操作,因此,有时候有些代码可能会改变一些数据,然后导致报错,所以不能随意地向一段内存空间写入数据或者代码,因为不知道这段空间是否存放着重要的数据或代码。
因此,我们通常使用0:200~0:2ff空间。
段前缀的使用
将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b单元中。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FC1jrl0R-1583721418522)(9.jpg)]
实验4 [bx]和loop的使用
(1)编程,向内存0:200~023f一簇传送数据0到63(3fh)。
(2)编程,编程,向内存0:200~023f一簇传送数据0到63(3fh),程序中只能用9条指令,包括”mov ax,4c00h“和”int 21h“。
上图程序即符合题目要求,不再次展示。
(3)下面程序是将”mov ax,4c00h之前的指令复制到内存0:200处,补全程序。
解答:
mov ax,cs
mov cx,5
复制的是“mov ax,cs”到“loop s”的代码