汇编语言实验 1:循环指令

515 阅读3分钟

1. 预备知识

  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 指令之间。

  1. [bx] 表示将寄存器 BX 的值作为偏移地址,段地址默认存放在 DS 中。

  2. 在 debug 模式下,p 指令可以在 loop 指令处一次性执行完所有循环而不必使用 t 指令单步执行。

  3. 在 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. 总结

  1. 本文介绍了汇编语言中用以实现循环功能的 loop 指令。loop 指令关键包括两点:用 BX 存放循环次数和将循环体写在标号和 loop 标号之间

  2. 参考:汇编语言/王爽著.——北京:清华大学出版社,2003