功能有二:第一个是在在循环使用时:mov cx,n ;s:。。。。;loop s 使得cx减一,然后继续循环,注意是先减一,若减一后cx为零了,那么就不执行循环了,跳过loop s向下执行。
第二个功能是没有循环,也没有前面的mov cx,n,这时就是判定执行到Loop s前的cx值,若cx为零则忽略Loop s,若cx不为零则继续执行下面的步骤。
总的来说两个功能是一样的,但还是分开理解吧,参悟透了就豁然开朗了
loop在汇编语言中是关键字,loop本身就是个指令,不能作为子程式入口名。可以将loop改为loop0 or loop1,只要符合命名规则就行。
LOOP $ 的作用是 一直执行当前指令(即LOOP指令),在这里和前一句合起来用,可以用来延时。
指令格式:LOOP 短标号
这条指令用于控制重复执行的一系列指令。指令执行前必须事先将重复次数放在CX寄存器中,每执行一次LOOP指令,CX自动减一。如果减一后CX不等于零,则转移到指令中所给定的标号处继续循环;若自动减一后CX=0.,则结束循环,执行LOOP指令后面的指令。
标号 $ 在这里表示当前指令的地址。
在汇编语言中,LOOP是循环指令,固定以CX控制循环次数,简化循环程序设计。
该指令书写格式:LOOP OPR(OPR是程序中的目标地址标号)
该指令执行步骤:(CX) ←(CX) −1;若(CX)≠0,则循环到标号处执行,否则顺序执行。
程序在使用LOOP指令之前应先将循环次数送入CX中。
例如:
MOV CX,10;设置循环次数
MOV AX,1
OPR1:
SHL AX,1
LOOP OPR1
loop通常用作循环处理,语法格式:loop标识。
cou执行loop指令需要两步:
1、(cx)=(cs)-1;
2、cx不为0的时候转到标号出执行,把IP改为标号的偏移地址,为0的时候执行loop下一条指令;
cx一般放循环次数;
格式框架如下:
movcx,循环次数
标号:循环执行的代码
loop标号
扩展资料
汇编中LOOP的使用
例:
assumecs:code
codesegment
movax,10
movcx,3
A:addax,ax
loopA
movax,4c00h
int21h
codeends
end
addax,ax位置在IP=0006的地址上,执行loopA时看到换成loop0006说明标识“A”编译成addax,ax的地址,这时候要执行我前面说的loop执行的两个步骤,
(cx)=(cx)-1=3-1=2cx为2不为0转到ip=0006执行循环
如果有很多次循环,如1000次,这样单步运行就很烦,这时候可以用g+偏移地址命令直接运行到你想要的指令处或者运行到loop处用p命令直接运行到循环的下一条指令处
参考资料来源:百度百科—goto语句
参考资料来源:百度百科—循环语句
这个程序循环一次,是由CX存放的。
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
执行loop s时,首先要将(cx)减1,若(cx)不为0,则前往s处执行add ax,ax。
CPU执行LOOP指令的时候,要进行两步操作:
1 (cx)=(cx)-1
2 判断cx中的值,不为零则转移到标号处执行程序,如果为零,则向下执行
例1 计算2^2 结果放在AX
CODE SEGMENT
ASSUME CS:CODE
MOV AX,2
ADD AX,AX
MOV AX,4C00H
INT 21H
code ENDS
END
例2 计算2^3 结果放在AX
CODE SEGMENT
ASSUME CS:CODE
MOV AX,2
ADD AX,AX
ADD AX,AX
MOV AX,4C00H
INT 21H
code ENDS
END
扩展资料:
注意:
计算ffff:0-ffff:b单元中的数据之和,结果存储在dx中。
运算后的结果会不会查过dx所可以承受的存储范围。ffff:0-ffff:b是字节型数据,范围在0-255,12个这样的数,即使都是255相加也不会超过65535
不可以直接将数据累加在dx中。因为ffff:0-ffff:b是字节型数据8位,dx中存放16位数据。
不可以直接将数据累加到dl中,因为dl是8位寄存器,所容纳的数据的范围在0-255之间,ffff:0-ffff:b中的数据也都是8位,若仅向dl累加12个8位数据,可能会引起进位丢失的这种情况。
参考资料:百度百科-Loop
pic单片机汇编指令loop的介绍就聊到这里吧,感谢您花时间阅读,谢谢。
本文标签:pic单片机汇编指令loop