1. 预备知识
- loop 指令用于实现循环功能,指令格式为 loop 标号。CPU 在执行 loop 指令时进行两步操作:寄存器 CX 的值减一;判断 CX 的值,如果值为零则向下执行,否则跳转至标号处执行。如:
mov ax,2
mov cx,2 ;寄存器CX控制循环次数
s:
add ax,ax
loop s ;如果(CX)=0则循环部分执行结束,否则跳转至s处
在汇编语言中,标号代表一个地址,该地址处存在某条指令。用寄存器 CX 和 loop 实现循环包括三个要点:(1)在寄存器 CX 中存放循环次数;(2)loop 指令中标号所标识地址在指令前面;(3)循环体位于标号和 loop 指令之间。
-
[bx] 表示将寄存器 BX 的值作为偏移地址,段地址默认存放在 DS 中。
-
在 debug 模式下,p 指令可以在 loop 指令处一次性执行完所有循环而不必使用 t 指令单步执行。
-
在 8086 模式下,随意向一段内存空间写入内容很危险,因为这段区域可能存放着重要的系统数据或代码。一般情况下,DOS 和其他合法程序不会使用 0000:0200~000:0300 这段区域。
2. 实验任务
根据预备知识,编程向内存 0000:0200~0000:023F 依次传送数据 0~3FH。
2.1 实验分析
首先,以传送第一个数据为例,mov ds:[bx],ax,其中 ds:[bx] 表示地址 0000:0200、ax 表示值 0。传送后续数据时,寄存器 AX 的值加一得到下一个待写数据,寄存器 BX 的值加一得到下一个写入的地址。根据传送数据长度,循环次数为 64。整体代码为:
assume cs:code
code segment
start:
mov ax,0
mov ds,ax ;段寄存器DS指向待写入地址的段地址
mov bx,200h ;寄存器BX保存待写入地址的首地址的偏移地址
mov ax,0 ;待写的第一个值
mov cx,64 ;循环次数
s:
mov ds:[bx],ax ;写值
inc bx ;内存单元地址的增长1
inc ax ;待写值增长1
loop s ;循环
mov ax,4c00h
int 21h
code ends
end start
2.2 实验结果
运行前,内存 0000:0200~0000:023F 的值的存放情况:
编译,链接并运行可执行文件。运行后,内存 0000:0200~0000:023F 的值的存放情况:
3. 总结
-
本文介绍了汇编语言中用以实现循环功能的 loop 指令。loop 指令关键包括两点:用 BX 存放循环次数和将循环体写在标号和 loop 标号之间
-
参考:汇编语言/王爽著.——北京:清华大学出版社,2003