_____________________________________________________ 功能: 广告流水灯程序 时间: 2010—9—13 注释: 指令MOV P2,#80H是一条废指令,不起作用,可删除 _____________________________________________________ ORG 00H MOV P2,#80H START:MOV A,#0FFH ;赋初值 CLR C MOV R2,#8 LOOP:RRC A ; 带进位右移 MOV P1,A CALL DELAY DJNZ R2,LOOP MOV R2,#7 LOOP1:RLC A ; 带进位左移 MOV P1,A CALL DELAY DJNZ R2,LOOP1 JMP START DELAY:MOV R3,#20 ; 延时0.2秒 D1: MOV R4,#20 D2: MOV R5,#248 DJNZ R5,$ DJNZ R4,D2 DJNZ R3,D1 RET END
ORG是Origin的缩写:起始地址源。在汇编语言源程序的开始通常都用一条ORG伪指令来实现规定程序的起始地址。如果不用ORG规定则汇编得到的目标程序将从0000H开始。例如:
CLR C是CF置零,相当于STAB CF的反操作,目的是将进位位置零. DJNZ指令有两种格式:DJNZ Rn,rel和DJNZ direct,rel,其实它的功能不止这些,本程序中使用到的只是一个标号,也就是工作寄存器组Rn非零则转移到标号标示的位置执行程序,为零则顺序进行下一条指令的执行。 RLC A ;累加器带进位位循环左移 JMP $ ;原地不动,即一直保持,无条件转移
ORG 2000H
START:MOV A,#00H
其实:ORG 00H这条指令的作用是定位初始地址,这里只是一个规定,没有其它含义。如上边的两条代码,规定了起始地址,那么得到的目标程序将不会从默认的00H开始,而是从定义的2000H处执行。至于第二条指令,MOV P2,#80H这条指令完全没有用,可以删去。
DJNZ Rn,rel 寄存器减1,非零转移
DJNZ direct,rel 直接地址单元减1,非零转移
RRC A ;累加器带进位位循环右移
上边的两条移位指令是带进位的移位指令,注意和汇编语言程序设计中的SHR、SHL、SAR、SAL进行比对,它相当于是SAR和SAL,也就是算术移位指令,因为标志寄存器CF始终参与移位。其实,汇编语言程序中存在一个循环移位指令,用到这里效率会更高。
END ;汇编程序结束, 这里不用也没有关系
另外对于DJNZ Rn,$来说,也不难理解。Rn内容递减,而$不变,即所谓原地跳转,但这是有条件转移指令,对于无条件转移指令JMP $来说,就是原地不动,一直保持。