简单程序是指没有使用转移类指令的程序,机器执行这类程序时只需按照先后顺序依次执行,中间不会有任何分支、循环,也无子程序调用,故又称为无分支程序,有时也称为顺序程序。在这类程序中,大量使用了数据传送指令,程序的结构比较简单,但能解决某些实际问题或成为复杂程序的某个组成部分。现以具体程序实例加以说明。
【例4-5】 拆字程序。将内部数据存储器50H单元中的一个8位二进制数拆开,分成两个4位数,高4位存入61H单元,低4位存入60H单元,60H、61H单元的高4位清零。
解:程序如下。
ORG 8000H
CZCX:MOV R0,#50H ;设源数据指针为R0
MOV R1,#60H ;设目的数据指针为R1
MOV A,@R0 ;取要拆的数
ANL A,#0FH ;高4位清零,拆出低4位
MOV @R1,A ;存低4位
INC R1 ;调整目的地址指针
MOV A,@R0 ;重新取数
ANL A,#0F0H ;低4位清零,拆出高4位
SWAP A ;移到低4位
MOV @R1,A ;存结果
图4-5 非压缩BCD码转换成 ASCII码流程图 |
【例4-6】 把一个非压缩的BCD码转换成ASCII码。设该非压缩的BCD码已存放在片内RAM 20H单元,利用查表法,编制一段程序,将ASCII码存入片内RAM 21H单元。
分析:BCD码中的0~9对应的ASCII码为30H~39H。在程序存储器的一片指定地址单元中,建立BCD码与ASCII码的对应表,用数据指针指向ASCII码表的首地址,则BCD码与数据指针之和的地址单元中的内容就是BCD码对应的ASCII码。
绘制程序流程图,如图4-5所示。
解:编制程序如下。
ORG00H
AJMP MAIN
ORG 30H
MAIN: MOV DPTR,#TABLE;指向表的首址
MOV A,20H ;取数据
MOVC A,@A+DPTR ;读该数据的ASCII码值
MOV 21H,A ;保存该数据的ASCII码值
SJMP $
TABLE DB 30H,31H,32H,33H,34H
DB 35H,36H,37H,38H,39H
END
【例4-7】 设变量放在片内RAM 20H单元,其取值范围为00H~09H。要求编制一段查表程序,查出变量的立方值,并存放入片内RAM 22H、21H单元。
分析:在程序存储器的一片连续区域,建立变量各个取值的立方表,该表中的每个数占两个字节。设该表的首地址为TABLE,变量X对应的立方值在TABLE+2X单元中,查出的结果送入片内RAM 22H、21H单元中。
根据上述分析可画出如图4-6所示流程图。
图4-6 查变量立方值的程序流程图
解:根据流程图编程如下。
ORG 00H
AJMP MAIN
ORG 30H
MAIN: MOV SP,#60H ;设置堆栈指针
MOV DPTR,#TABLE ;DPTR指向表的首址
MOV A,20H ;取要转换的数
ADD A,20H ;该数乘以2
PUSH A
MOVC A,@A+DPTR ;查表得出该数立方值的低8位,存放于A中
MOV 21H,A ;保存该数立方值的低8位
POP A
INC DPTR
MOVC A,@A+DPTR ;查表得出该数立方值的高8位,存放于A中
MOV 22H,A ;保存该数立方值的高8位
SJMP $
TABLE DW 0000H,0001H,0008H,001BH
DW 0040H,007DH,OOD8H,0157H
DW 0200H,02D9H
END
【例4-8】 设双字节数X存放在片内RAM 41H、40H单元中,Y存放在42H、43H单元中,编程求Z=X+Y,并存入片内RAM 44H、45H、46H单元中。
分析:被加数、加数及它们的和在片内RAM的空间分配如表4-1所示。
解:编程如下。
ORG 00H
AJMP MAIN
0RG 30H
MAIN:MOV A,40H ;取被加数的低字节
ADD A,42H ;加上加数的低字节
MOV 44H,A ;保存和的低字节
MOV A,41H ;取被加数的高字节
ADDC A,43H ;加上加数的高字节
MOV 45H,A ;保存和的高字节
MOV A,#0 ;求高字节进位
ADDC A,#0
MOV 46H,A
SJMP $
END
表4-1 RAM的空间分配表
片内RAM |
片内RAM | ||
地 址 |
内 容 |
地 址 |
内 容 |
46H |
ZH |
42H |
YL |
45H |
ZM |
41H |
XH |
44H |
ZL |
40H |
XL |
43H |
YH |
|
|