汇编程序设计(1)

3-20 编写程序,采用算术平均值滤波法求采样平均值,设8次采样值依次放在20H~27H的连续单元中,结果保留在A中。
解:首先需要对这块区域中八个数相加,然后做平均值处理

      ORG 0200H
FILT: MOV R0,#08H
      MOV A,#0H
      MOV R1,#20H
      MOV B,#8
FILT1:ADD A,@R1
      INC R1
      DJNZ R0,FILT1
      DIV AB
      RET

3-21 编写程序,将存放在内部RAM起始地址为20H和30H的两个3字节无符号相减,结果存放在内部RAM单元70H、71H、72H中(低位对应低字节)。
顺序执行的写法:从低位向高位逐个进行相减并考虑。

        ORG 0000H
START:  CLR C
        MOV R0,#20H   ;将20H的起始地址送给R0
        MOV R1,#30H   ;将30H的起始地址送给R1
        MOV A,@R0     ;将20H的内容给A
        SUBB A,@R1    ;将A和30H相减
        MOV 70H,A     ;将相减的值放在70H单元中
        MOV R0,#21H   ;将21H的起始地址送给R0
        MOV R1,#31H   ;将31H的起始地址送给R1
        MOV A,@R0     ;将21H的内容给A
        SUBB A,@R1    ;将A和31H的内容相减
        MOV 71H,A     ;将相减的值放在71H单元中
        MOV R0,#22H   ;将22H的起始地址送给R0
        MOV R1,#32H   ;将32H的起始地址送给R0
        MOV A,@R0     ;将22H的内容给A
        SUBB A,@R1    ;将A和32H的内容相减
        MOV 72H,A     ;将相减的值放在72H单元中
        RET

循环控制的写法

        ORG 0000H
START:  MOV R0,#20H   ;将20H的起始地址送给R0
        MOV R1,#30H   ;将30H的起始地址送给R1
        MOV R2,#3     ;设置循环次数为3
        MOV DPTR,#70H ;将70H的地址送给DPTR
        CLR C         ;对C清零
LOOP:   MOV A,@R0
        SUBB A,@R1
        MOVX @DPTR,A
        INC R0        ;指针加一指向下一个单元
        INC R1        ;指针加一指向下一个单元
        INC DPTR      ;指针加一指向下一个单元
        DJNZ R2,LOOP  ;减1判断是否继续循环
        CLR A         ;对A清零    
        SUBB A,#0     ;判断A是否有借位
        MOVX @DPTR,A  ;将借位给DPTR
        RET

3-22 假设在R0指向的片内RAM区,存有20个16进制数的ASCII字串。将ASCII码转换为16进制数,然后两两合成一个字节,从低地址单元到高地址单元依次组合。
解:设定本题中所指的160-进制数的ASCII码值仅考虑’0’-‘9’,‘A’-‘F,不考虑’a’-‘f’.
那么需要将连续相邻2个单元中的ASCII串取出来(内循环次数),分别取10次(外循环次数).针对这两种类型的ASCII,‘0’-'9’在30-39H,‘A’-‘F’在41-46H,而41H=30H+0AH+07H,那么可以通过减40H判断是否有借位,如果有借位说明属于’0’-‘9’类型,否则为’A’-‘F’类型。那么针对’A’-‘F’可以在判断借位后先减掉07H,再和’0’-'9’类一起共享减去30H转换为ASCII码的子程序。

          ORG 0000H
          MOV R0,#YUAN    ;将存放ASCII码的源数据地址指针给R0
          MOV R1,#MUBIAO  ;将存放转换后十六进制数据的目标数据地址指针给R1
          MOV R2,#10      ;外循环次数为10
CONT:     MOV R3,#02H     ;内循环次数为2      
PANDUAN:  CLR C
          MOV A,@R0       ;取出第一个数
          PUSH A          ;数据备份
          SUBB A,#40H     ;将数据与40H相减判断是否有借位
          POP A           ;恢复A便于后续操作
          JC ZHUANMA      ;有借位则说明为数字,无借位则顺序执行
          SUBB A,#007H    ;将字母减掉07H
ZHUANMA:  SUBB A,#30H     ;第一个数处理完毕
          PUSH A          ;压栈保存数据
          DJNZ R3,PANDUAN ;内循环没结束则继续
          POP A           ;弹出高位16进制
          SWAP A          ;放入高四位
          MOV @R1,A       ;放到目标地址
          POP A           ;弹出低位16进制
          ADD A,@R1
          MOV @R1,A
          DJNZ R3,CONT
FINAL:    END

你可能感兴趣的:(汇编设计)