您的位置: 网站首页 > 电子与嵌入式 > 单片机原理与应用 > 第4章 汇编语言程序设计 > 【4.2 简单程序设计】

4.2 简单程序设计

 

简单程序是指没有使用转移类指令的程序,机器执行这类程序时只需按照先后顺序依次执行,中间不会有任何分支、循环,也无子程序调用,故又称为无分支程序,有时也称为顺序程序。在这类程序中,大量使用了数据传送指令,程序的结构比较简单,但能解决某些实际问题或成为复杂程序的某个组成部分。现以具体程序实例加以说明。

【例4-5 拆字程序。将内部数据存储器50H单元中的一个8位二进制数拆开,分成两个4位数,高4位存入61H单元,低4位存入60H单元,60H61H单元的高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码流程图

         SJMP $           ;停机

【例4-6 把一个非压缩的BCD码转换成ASCII码。设该非压缩的BCD码已存放在片内RAM 20H单元,利用查表法,编制一段程序,将ASCII码存入片内RAM 21H单元。

分析:BCD码中的09对应的ASCII码为30H39H。在程序存储器的一片指定地址单元中,建立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单元,其取值范围为00H09H。要求编制一段查表程序,查出变量的立方值,并存放入片内RAM 22H21H单元。

分析:在程序存储器的一片连续区域,建立变量各个取值的立方表,该表中的每个数占两个字节。设该表的首地址为TABLE,变量X对应的立方值在TABLE+2X单元中,查出的结果送入片内RAM 22H21H单元中。

根据上述分析可画出如图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     22HA              ;保存该数立方值的高8

        SJMP    $

TABLE   DW      0000H,0001H,0008H,001BH

        DW      0040H,007DH,OOD8H,0157H

        DW      0200H,02D9H

        END

【例4-8 设双字节数X存放在片内RAM 41H40H单元中,Y存放在42H43H单元中,编程求Z=X+Y,并存入片内RAM 44H45H46H单元中。

分析:被加数、加数及它们的和在片内RAM的空间分配如表4-1所示。

解:编程如下。

         ORG     00H

         AJMP    MAIN

         0RG        30H

 MAINMOV     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