CPU执行Loop指令时,要进行两步操作:
- (cx)=(cx)-1
- 判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行
通常我们用loop指令来实现循环功能,cx中存放循环次数。
用cx和loop指令向配合实现循环功能的程序框架如下:
mov cx,循环次数
s:
循环执行的程序段
loop s
编程计算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
计算ffff:0006单元中的数乘以3,结果存储在dx中。 assume cs:code code segment mov ax,0fffh ;在汇编程序中,数据不能以字母开头 mov ds,ax mov bx,6 mov al,[bx] mov ah,0 mov dx,0 mov cx,3 s: add dx,ax loop s mov ax,4c00h int 21h code ends end
计算ffff:0~ffff:b单元中的数据的和,结果存储在dx中。 代码中使用了一个16位寄存器来做中介,将内存单元的8位数据赋值到一个16位寄存器ax中,再将ax中的数据加到dx上,
从而使两个运算对象的类型匹配并且结果不会越界。 assume cs:code code segment mov ax,0ffffh mov ds,ax mov bx,0 mov dx,0 mov cx,12 s: mov al,[bx] mov ah,0 add dx,ax inc bx ;ds:bx指向下一个单元 loop s mov ax,4c00h int 21h code ends end
将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b单元中。
这里使用两个段寄存器分别存放原始单元ffff:X和目标单元0020:X的段地址,可以省略循环中需要重复做12次的设置ds的程序员。 assume cs:code code segment mov ax,0ffffh mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,12 s: mov dl,[bx] mov es:[bx], dl inc bx loop s mov ax,4c00h int 21h code ends end
assume cs:code code segment mov ax,cs mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,17h s: mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end