c51汇编语⾔循环指令,汇编语⾔循环指令loop
loop指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位移,⽽不是⽬的地址。对IP的修改范围都为:-128--127
Loop指令的格式:
loop标号((cx)=(cx)-1,如果(cx) ≠ 0,转移到标号处执⾏。
操作:
(1)(cx)=(cx)-1
(2)判断cx的值是否为0
如果cx ≠ 0,跳转到标号出执⾏ (IP)=(IP)+8 位位移
8位位移=标号处的地址-loop指令后的第⼀个字节的地址;
8位位移的范围为-128--127,⽤补码表⽰;
8位位移由编译程序在编译时算出。
如果cx=0,执⾏loop后⾯的其它指令。
我们从loop的功能中可以看出,"loop标号”的功能相当于:
(CX)--
if((cx) ≠0) jmp short标号,
cx中的值影响着loop指令的执⾏结果。通常我们⽤loop指令来实现循环功能,cx中存放循环次数。
测例
任务1:编程计算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)标号
在汇编语⾔中,标号代表⼀个地址,此程序中有⼀个标号s。它实际上标识了⼀个地址,这个地址处有⼀条指令:add ax,ax
(2)loop s
CPU执⾏loop s的时候,要进⾏两步操作:
(cx)=(cx)-1;
判断cx中的值,不为0则转折标号s所标识的地址处执⾏(这⾥的指令是"add ax,ax"),如果为0则执⾏下⼀条指令(这⾥的下⼀条指令是"mov ax,4c00h")
(3)以下三条指令
mov cx,11
s:add ax,ax
loop s
执⾏loop s时,⾸先要将(cx)减⼀,然后若(cx)不为0,刚向前转⾄s处执⾏add ax,ax。
所以,我们可以利⽤cx来控制add ax,ax的执⾏次数。
任务2:计算ffff:0006单元中的数乘以3,结果存储在dx中。
(1)运算后的结果是否会超出dx所能储存的范围?
ffff:0006单元中的数是⼀个字节型的数据,范围在0~255之间,
汇编指令有多少个则⽤它和3相乘结果不会⼤于65535,可以在dx中存放下。
(2)我们⽤循环累加来实现乘法,⽤哪个寄存器进⾏累加?
我们将ffff:0006单元中的数赋给ax,⽤dx进⾏累加。先设(dx)=0,然后做3次
(dx)=(dx)+(ax)。
(3)ffff:0006单元是⼀个字节单元,ax是⼀个16位寄存器,数据长度不⼀样,如何赋值?
注意,“赋值”是让ax中数据的值和ffff:0006单元中的数据的值相等。
8位数据01h和16位数据0001h的数据长度不⼀样,但它们的值是相等的。
赋值过程:
令(ah)=0,(al)=(fff6h)
程序:
assume cs:codesg
codesg segment
mov ax,0ffffh ;汇编源程序中,数据不能以字母开头
mov ds,ax
mov bx,6
mov al,[bx] ;以上,设置(ah)=0,(al)=((ds)*16+bx)
mov ah,0
mov dx,0 ;累加寄存器清零
mov cx,3 ;循环3次
s:add dx,ax
loop s
mov ax,4c00h
int 21h
codesg ends
end
任务3:求7+7+7+7+7的和:
CODE SEGMENT ;定义代码段
ASSUME CS:CODE,DS:DATA ;将CS和CODE,DS和DATA段建⽴联系START:
MOV AX,0 ;初始化AX,⽤于存储求和结果
MOV CX,5 ;初始化循环次数,每循环⼀次,CX会⾃动减1,不需要⾃⼰写代码减L: ;循环累加
ADD AX,7
LOOP L
MOV AH,4C00H ;将控制权返回给终端。
INT 21H
CODE ENDS
end
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论