首先,我是一名初學(xué)者,我希望和大家一起進(jìn)步、一起成長。
這里,我要跟大家分享:匯編語言中巧用間址寄存器使程序簡短。
例一,將內(nèi)部RAM中30H開始的8個(gè)單元全部清零。
最原始最笨重的辦法是順序傳送立即數(shù):
L1: MOV 30H,#00H
MOV 31H,#00H
。。。。。。
MOV 37H,#00H
RET
采用以上辦法,如果要作用的不是8個(gè)、而是16個(gè)甚至更多個(gè)字節(jié)單元,那程序?qū)荛L。
而以下的程序就簡短得多:
S1: MOV RO,#30H
MOV R1,#08H
S11: MOV @R0,#00H
INC R0
DJNZ R1,S11 ;R1減一等于0表示MOV @R0,#00H已執(zhí)行8次
RET
我們經(jīng)常會在很多程序中的初始化部分發(fā)現(xiàn)上面形式的程序段。
而我的習(xí)慣則是:
S12: MOV R0,#30H
S121: MOV @R0,#00H
INC R0
CJNE R0,#38H,S121 ;R0等于38H,表示最后的37H已執(zhí)行清零操作
RET
例二,給30H送0,31H送1,32送2,33H送3等等,37H送7
順序傳送立即數(shù):
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內(nèi)容送至50H,31H內(nèi)容送至51H,32H內(nèi)容送至52H,等等,37H內(nèi)容送至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四個(gè)單元內(nèi)容均小于十進(jìn)制數(shù)100,把30H個(gè)位送50H,十位送51H,31H個(gè)位送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
例五,采用動(dòng)態(tài)掃描顯示30H至33H四個(gè)單元內(nèi)容,P1段選,P2位選
順序方式:
L5: MOV A,30H
MOVC A,@A+DPTR ;查表
MOV P1,A
SETB P2.0 ;選中第一位數(shù)碼管,這里是共陽數(shù)碼管位選同相驅(qū)動(dòng),或者共陰數(shù)碼管反相驅(qū)動(dòng)
ACALL DEL ;延時(shí)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 ;選中數(shù)碼管左移一位
MOV R1,A
CJNE RO,#34H,S51
RET
|