【例4-1】片内RAM的21H单元存放一个十进制数据十位的ASCII码,22H单元存放该数据个位的ASCII码。编写程序将该数据转换成压缩BCD码存放在20H单元。
ORG 0040H
START:MOV A,21H ;取十位ASCII码
ANL A,#0FH ;保留低半字节
SWAP A ;移至高半字节
MOV 20H,A ;存于20H单元
MOV A,22H ;取个位ASCII码
ANL A,#0FH ;保留低半字节
ORL 20H,A ;合并到结果单元
SJMP $
END
【例4-2】设变量x以补码的形式存放在片内RAM的30H单元,变量y与x的关系是:当x大于0时,y=x;当x=0时,y=20H;当x小于0时,y=x+5。编制程序,根据x的大小求y并送回原单元。
ORG 0040H
START:MOV A,30H ;取x至累加器
JZ NEXT ;x = 0 ,转NEXT
ANL A,#80H ;否,保留符号位
JZ DONE ;x >0 ,转结束
MOV A,#05H ;x <0 ,处理Y=X+5
ADD A,30H
MOV 30H,A ;X+05H送Y
SJMP DONE
NEXT:MOV 30H,#20H ;x = 0 ,20H送Y
DONE:SJMP DONE
END
【例4-3】根据R7的内容x(转移序号)转向相应的处理程序。
设R7内容为0~4,对应的处理程序入口地址分别为PP0~PP4。
START:MOV R7,#3 ;以转移序号3为例
ACALL JPNUM
AJMP START
JPNUM:MOV DPTR,#TAB ;置分支入口地址
首址
MOV A,R7
ADD A,R7 ;乘2,调整偏移量
MOV R3,A
MOVC A,@A+DPTR ;取地址高字节,暂存于R3
XCH A,R3
INC A
MOVC A,@A+DPTR ;取地址低字节
MOV DPL,A ;处理程序入口地址低8位送DPL
MOV DPH,R3 ;处理程序入口地址高8位送DPH
CLR A
JMP @A+DPTR
TAB:DW PP0
DW PP1
DW PP2
DW PP3
DW PP4
PP0:MOV 30H,#0 ;转移序号为0时,置功能号“0”于30H单元
RET
PP1:MOV 30H,#1 ;转移序号为1时,置功能号“1”于30H单元
RET
PP2:MOV 30H,#2 ;转移序号为2时,置功能号“2”于30H单元
RET
PP3:MOV 30H,#3 ;转移序号为3时,置功能号“3”于30H单元
RET
PP4:MOV 30H,#4 ;转移序号为4时,置功能号“4”于30H单元
RET
【例4-4】将内部RAM的30H至3FH单元初始化为00H。
MAIN:MOV R0,#30H ;置初值
MOV A,#00H ;
MOV R7,#16 ;
LOOP:MOV @R0,A ;循环处理
INC R0 ;
DJNZ R7,LOOP ;循环修改,判结束
SJMP $ ;结束处理
【例4-5】将内部RAM起始地址为60H的数据串传送到外部RAM中起始地址为1000H的存储区域,直到发现‘$’字符停止传送。
MAIN:MOV R0,#60H ;置初值
MOV DPTR,#1000H
LOOP0:MOV A,@R0 ;取数据
CJNE A,#24H,LOOP1 ;循环结束?
SJMP DONE ;是
LOOP1:MOVX @DPTR,A ;循环处理
INC R0 ;循环修改
INC DPTR
SJMP LOOP0 ;继续循环
DONE:SJMP DONE ;结束处理
【例4-6】实现两个8位的十六进制无符号数求和的子程序。
入口:(R3)=加数; 出口:(R3)=和的高字节;
(R4)=被加数。 (R4)=和的低字节。
SADD:MOV A,R3 ;取加数(在R3中)
CLR C
ADD A,R4 ;被加数(在R4中)加A
JC PP1
MOV R3,#00H ;结果小于255时,高字节R3内容为00H
SJMP PP2
PP1:MOV R3,#01H ;结果大于255时,高字节R3内容为01H
PP2:MOV R4,A ;结果的低字节在R4中
RET
【例4-7】将内部RAM 中两个4字节无符号整数相加,和的高字节由R0指向。数据采用大端模式存储。
入口:(R0)=加数低字节地址; 出口:(R0)=和的高字节起始地址。
(R1)=被加数低字节地址。
NADD:MOV R7,#4 ;字节数4送计数器
CLR C ;
NADD1:MOV A,@R0 ;利用指针,取加数低字节
ADDC A,@R1 ;利用指针,被加数低字节加A
MOV @R0,A ;
DEC R0
DEC R1
DJNZ R7,NADD1
INC R0 ;调整指针,指向出口
RET
【例4-8】 将内部RAM中20H单元中的1个字节十六进制数转换为2位ASCII码,存放在R0指示的两个单元中。
HEASC:MOV R1,SP ;借用R1为堆栈指针
DEC R1
DEC R1 ;R1指向被转换数据
XCH A,@R1 ;取被转换数据
ANL A,#0FH ;取一位十六进制数
ADD A,#2 ;偏移调整,所加值为MOVC与DB间总字节数
MOVC A,@A+PC ;查表
XCH A,@R1 ;1字节指令,存结果于堆栈中
RET ;1字节指令
ASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H
DB 38H,39H,41H,42H,43H,44H,45H,46H
MAIN:MOV A,20H ;取被转换数至A
SWAP A
PUSH ACC ;预转换的数据(在低半字节)入栈
ACALL HEASC
POP ACC ;弹出栈顶结果于ACC中
MOV @R0,A ;存转换结果高字节
INC R0 ;修改指针
PUSH 20H ;预转换的数据(在低半字节)入栈
ACALL HEASC
POP ACC ;弹出栈顶结果于ACC中
MOV @R0,A ;存转换结果低字节
SJMP $
[例4-9] 已知BLOCK1和BLOCK2为起始地址的存储区中分别有5字节无符号被减数和减数(低位在前,高位在后)。请编制一个减法子程序,令它们相减,并把差值放入BLOCK1为起始地址的存储单元。
解:用减法指令从低字节开始相减。相应程序为:
ORG 1000H
SBYTESUB: MOV R0,#BLOCK1 ;被减数始址送R0
MOV R1,#BLOCK2 ;减数始址送R1
MOV R2,#05H ;字节长送R2
CLR C ;Cy清零
LOOP: MOV A,@R0 ;被减数送A
SUBB A,@R1 ;相减
MOV @R0,A ;存差
INC R0 ;修改被减数地址指针