首先,我是一名初学者,我希望和大家一起进步、一起成长。
这里,我要跟大家分享:汇编语言中巧用间址寄存器使程序简短。
例一,将内部RAM中30H开始的8个单元全部清零。
最原始最笨重的办法是顺序传送立即数:
L1: MOV 30H,#00H
MOV 31H,#00H
。。。。。。
MOV 37H,#00H
RET
采用以上办法,如果要作用的不是8个、而是16个甚至更多个字节单元,那程序将会很长。
而以下的程序就简短得多:
S1: MOV RO,#30H
MOV R1,#08H
S11: MOV @R0,#00H
INC R0
DJNZ R1,S11 ;R1减一等于0表示MOV @R0,#00H已执行8次
RET
我们经常会在很多程序中的初始化部分发现上面形式的程序段。
而我的习惯则是:
S12: MOV R0,#30H
S121: MOV @R0,#00H
INC R0
CJNE R0,#38H,S121 ;R0等于38H,表示最后的37H已执行清零操作
RET
例二,给30H送0,31H送1,32送2,33H送3等等,37H送7
顺序传送立即数:
L2: MOV 30H,#00H
MOV 31H,#01H
.。。。。。。
MOV 37H,#07H
RET
采用间址寄存器:
S2: MOV R0,#30H
MOV A,#00H
S21: MOV @R0,A
INC R0
INC A
CJNE R0,#38H,S21
RET
例三,将30H内容送至50H,31H内容送至51H,32H内容送至52H,等等,37H内容送至57H
顺序传送方式:略
采用间址寻址方式:
S3: MOV R0,#30H
MOV R1,#50H
S31: MOV A,@R0
MOV @R1,A
INC R0
INC R1
CJNE R0,38H,S31
RET
例四,已知30H至33H四个单元内容均小于十进制数100,把30H个位送50H,十位送51H,31H个位送52H,十位送53H,依此类推
顺序方式:
L4: MOV A,30H
MOV B,#0AH
DIV AB
MOV 50H,B
MOV 51H,A
MOV A,31H
MOV B,#0AH
DIV AB
MOV 52H,B
MOV 53H,A
MOV A,32H
MOV B,#0AH
DIV AB
MOV 54H,B
MOV 55H,A
。。。。。。
RET
采用间址寻址方式:
S4: MOV R0,#30H
MOV R1,#50H
S41: MOV A,@R0
MOV B,#0AH
DIV AB
MOV @R1,B
INC R1
MOV @R1,A
INC R0
INC R1
CJNE R0,#34H,S41
RET
例五,采用动态扫描显示30H至33H四个单元内容,P1段选,P2位选
顺序方式:
L5: MOV A,30H
MOVC A,@A+DPTR ;查表
MOV P1,A
SETB P2.0 ;选中第一位数码管,这里是共阳数码管位选同相驱动,或者共阴数码管反相驱动
ACALL DEL ;延时1毫秒
CLR P2.0
MOV A,31H
MOVC A,@A+DPTR
MOV P1,A
SETB P2.1
ACALL DEL
CLR P2.1
MOV A,32H
MOVC A,@A+DPTR
MOV P1,A
SETB P2.2
ACALL DEL
CLR P2.2
。。。。。。
RET
采用间址寻址方式:
S5: MOV R0,#30H
MOV R1,#01H
S51: MOV A,@R0
MOVC A,@A+DPTR
MOV P1,A
MOV P2,R1
INC R0
MOV A,R1
RL A ;选中数码管左移一位
MOV R1,A
CJNE RO,#34H,S51
RET
|