• 汇编程序的进制转换


    MCS-51单片机十六进制十进制转换汇编源程序
    RW0       equ    0x08
    RW1       equ    0x09
    RW2       equ    0x0A
    RW3       equ    0x0B
    RW4       equ    0x0C
    RW5       equ    0x0D
    RW6       equ    0x0E
    RW7       equ    0x0F
    U_byte    equ    0x10             ; 十六进制数高8位
    H_byte    equ    0x11
    M_byte    equ    0x12
    L_byte    equ    0x13             ; 低8位
    ;----------------------------------------------------------------
              org    0x0000
              sjmp   C51JUST
              org    0x0030
    C51JUST: mov    SP,#0x5F         ; 堆栈指针(60H)
              mov    RW0,#0x99        ; BCD=99999999(HEX=0x5F5E0FF)
              mov    RW1,#0x99
              mov    RW2,#0x99
              mov    RW3,#0x99
              acall BCD8HEX          ; 调用BCD转HEX子程序
              acall HEX4BCD          ; 调用HEX转BCD子程序
              sjmp   $
    ;================================================================
    ; ①十六进制整数转换成BCD码整数子程序(最大值HEX=0x270F,BCD=9999)
    ; 待转换的十六进制整数在M_byte、L_byte
    ; 转换后的4位BCD码整数在RW1、RW2中。程序编码19, 时钟周期264
    HEX2BCD: mov    RW1,#0
              mov    RW2,#0
              mov    RW7,#16          ; 循环16次
    BYTS4D:   mov    A,L_byte         ; 最低位的内容→A
              rlc    A                ; 带C左移,L_byte-7bit→C
              mov    L_byte,A
              mov    A,M_byte
              rlc    A
              mov    M_byte,A
              mov    A,RW2            ; BCD码带进位自身相加(×2)
              addc   A,RW2
              da     A                ; 十进制调整
              mov    RW2,A
              mov    A,RW1
              addc   A,RW1
              da     A
              mov    RW1,A            ; 高位数≤6,不用调整
              djnz   RW7,BYTS4D       ; 处理完16bit?否,继续
              ret
    ;----------------------------------------------------------------
    ; ②十六进制整数转换成BCD码整数子程序(最大值HEX=0xF423F,BCD=999999)
    ; 待转换的十六进制整数在H_byte、M_byte、L_byte
    ; 转换后的6位BCD码整数在RW1、RW2、RW3中。程序编码27, 时钟周期639
    HEX3BCD: mov    RW1,#0
              mov    RW2,#0
              mov    RW3,#0
              mov    RW7,#24          ; 循环24次
    BYTS6D:   mov    A,L_byte         ; 最低位的内容→A
              rlc    A                ; 带C左移,L_byte-7bit→C
              mov    L_byte,A
              mov    A,M_byte
              rlc    A
              mov    M_byte,A
              mov    A,H_byte
              rlc    A
              mov    H_byte,A
              mov    A,RW3            ; BCD码带进位自身相加(×2)
              addc   A,RW3
              da     A                ; 十进制调整
              mov    RW3,A
              mov    A,RW2
              addc   A,RW2
              da     A
              mov    RW2,A
              mov    A,RW1
              addc   A,RW1
              da     A
              mov    RW1,A            ; 高位数≤6,不用调整
              djnz   RW7,BYTS6D       ; 处理完24bit?否,继续
              ret
    ;----------------------------------------------------------------
    ; ③十六进制整数转换成BCD码整数子程序, 最大值0x5F5E0FF(BCD=99999999)
    ; 待转换的十六进制数在U_byte、H_byte、M_byte、L_byte, 最高位在U_byte
    ; 转换后的十进制数(BCD码)在RW0、RW1、RW2、RW3; 程序编码35, 时钟周期970
    HEX4BCD: mov    RW7,#32          ; 4字节HEX码,循环32次
              mov    RW0,#0x0         ; 清零备用
              mov    RW1,#0x0
              mov    RW2,#0x0
              mov    RW3,#0x0
    BYTS8D:   mov    A,L_byte         ; 最低位的内容→A
              rlc    A                ; 带C左移,L_BYTE-7bit→C
              mov    L_byte,A
              mov    A,M_byte
              rlc    A
              mov    M_byte,A
              mov    A,H_byte
              rlc    A
              mov    H_byte,A
              mov    A,U_byte
              rlc    A
              mov    U_byte,A
              mov    A,RW3            ; 低位开始,R3的内容→A
              addc   A,RW3            ; BCD码带进位自身相加(相当于乘2)
              da     A                ; 十进制调整
              mov    RW3,A
              mov    A,RW2
              addc   A,RW2
              da     A
              mov    RW2,A
              mov    A,RW1
              addc   A,RW1
              da     A
              mov    RW1,A
              mov    A,RW0
              addc   A,RW0
              da     A
              mov    RW0,A
              djnz   RW7,BYTS8D       ; 处理完32bit? 否,继续
              ret
    ;================================================================
    ; ①BCD码整数转换十六进制整数
    ; 4位BCD码整数在RW2、RW3中, 十六进制整数仍在RW2、RW3中
    ; 最大转换数值BCD=9999(HEX=0x270F); 程序编码23, 时钟周期48
    BCD2HEX: mov    A,RW3            ; 将低字节转换成十六进制
              mov    B,#16            ; 分离十位和个位
              div    AB
              mov    RW7,B            ; 暂存个位
              mov    B,#10            ; 将十位转换成十六进制
              mul    AB
              add    A,RW7            ; 按十六进制加上个位
              mov    RW3,A
              mov    A,RW2            ; 将高字节转换成十六进制
              mov    B,#16
              div    AB
              mov    RW7,B
              mov    B,#10
              mul    AB
              add    A,RW7
              mov    B,#100           ; 调整
              mul    AB
              add    A,RW3
              mov    RW3,A
              clr    A
              addc   A,B
              mov    RW2,A
              ret
    ;----------------------------------------------------------------
    ; ②BCD转换二进制; 输入6位阿拉伯数字到RW1、RW2、RW3, 最高位是RW1
    ; 十六进制输出在H_byte、M_byte、L_byte, 最高位是H_byte
    ; 最大转换数值BCD=999999(HEX=0xF423F); 程序编码86, 时钟周期348
    BCD6HEX: mov     H_byte,#0x0
              mov     M_byte,#0x0
              mov     L_byte,#0x0
              mov     A,RW1
              swap    A
              acall   MPY10A
              mov     A,RW1
              acall   MPY10A
              mov     A,RW2
              swap    A
              acall   MPY10A
              mov     A,RW2
              acall   MPY10A
              mov     A,RW3
              swap    A
              acall   MPY10A
              mov     A,RW3
              anl     A,#0xF
              add     A,L_byte
              mov     L_byte,A
              clr     A
              addc    A,M_byte
              mov     M_byte,A
              ret
    ;---------------------------------
    MPY10A:   anl     A,#0xF
              add     A,L_byte
              mov     L_byte,A
              clr     A
              addc    A,M_byte
              mov     M_byte,A
              clr     C
              mov     A,L_byte
              rlc     A
              mov     RW7,A
              mov     A,M_byte
              rlc     A
              mov     RW6,A
              mov     A,H_byte
              rlc     A
              mov     RW5,A
             
              clr     C
              mov     A,L_byte
              rlc     A
              mov     L_byte,A
              mov     A,M_byte
              rlc     A
              mov     M_byte,A
              mov     A,H_byte
              rlc     A
              mov     H_byte,A
              clr     C
              mov     A,L_byte
              rlc     A
              mov     L_byte,A
              mov     A,M_byte
              rlc     A
              mov     M_byte,A
              mov     A,H_byte
              rlc     A
              mov     H_byte,A
              clr     C
              mov     A,L_byte
              rlc     A
              mov     L_byte,A
              mov     A,M_byte
              rlc     A
              mov     M_byte,A
              mov     A,H_byte
              rlc     A
              mov     H_byte,A
              mov     A,RW7
              add     A,L_byte
              mov     L_byte,A
              clr     A
              addc    A,M_byte
              mov     M_byte,A
              mov     A,RW6
              add     A,M_byte
              mov     M_byte,A
              clr     A
              addc    A,H_byte
              mov     H_byte,A
              mov     A,RW5
              add     A,H_byte
              mov     H_byte,A
              ret
    ;----------------------------------------------------------------
    ; ③BCD转换十六进制; 输入8位阿拉伯数字到RW0、RW1、RW2、RW3, 最高位是RW0
    ; 十六进制输出在U_byte、H_byte、M_byte、L_byte, 最高位是U_byte
    ; 最大转换数值BCD=99999999(HEX=0x5F5E0FF); 程序编码118, 时钟周期664
    BCD8HEX: mov     U_byte,#0x0
              mov     H_byte,#0x0
              mov     M_byte,#0x0
              mov     L_byte,#0x0
             
              mov     A,RW0
              swap    A         
              acall   MPY10B
              mov     A,RW0
              acall   MPY10B
              mov     A,RW1
              swap    A
              acall   MPY10B
              mov     A,RW1
              acall   MPY10B
              mov     A,RW2
              swap    A
              acall   MPY10B
              mov     A,RW2
              acall   MPY10B
              mov     A,RW3
              swap    A
              acall   MPY10B
              mov     A,RW3
              anl     A,#0xF
              add     A,L_byte
              mov     L_byte,A
              clr     A
              addc    A,M_byte
              mov     M_byte,A
              ret
    ;---------------------------------
    MPY10B:   anl     A,#0xF
              add     A,L_byte
              mov     L_byte,A
              clr     A
              addc    A,M_byte
              mov     M_byte,A
              clr     C
              mov     A,L_byte
              rlc     A
              mov     RW7,A
              mov     A,M_byte
              rlc     A
              mov     RW6,A
              mov     A,H_byte
              rlc     A
              mov     RW5,A
              mov     A,U_byte
              rlc     A
              mov     RW4,A
              clr     C
              mov     A,L_byte
              rlc     A
              mov     L_byte,A
              mov     A,M_byte
              rlc     A
              mov     M_byte,A
              mov     A,H_byte
              rlc     A
              mov     H_byte,A
              mov     A,U_byte
              rlc     A
              mov     U_byte,A
              clr     C
              mov     A,L_byte
              rlc     A
              mov     L_byte,A
              mov     A,M_byte
              rlc     A
              mov     M_byte,A
              mov     A,H_byte
              rlc     A
              mov     H_byte,A
              mov     A,U_byte
              rlc     A
              mov     U_byte,A
              clr     C
              mov     A,L_byte
              rlc     A
              mov     L_byte,A
              mov     A,M_byte
              rlc     A
              mov     M_byte,A
              mov     A,H_byte
              rlc     A
              mov     H_byte,A
              mov     A,U_byte
              rlc     A
              mov     U_byte,A
              mov     A,RW7
              add     A,L_byte
              mov     L_byte,A
              clr     A
              addc    A,M_byte
              mov     M_byte,A
              clr     A
              addc    A,H_byte
              mov     H_byte,A
              clr     A
              addc    A,U_byte
              mov     U_byte,A
              mov     A,RW6
              add     A,M_byte
              mov     M_byte,A
              clr     A
              addc    A,H_byte
              mov     H_byte,A
              clr     A
              addc    A,U_byte
              mov     A,RW5
              add     A,H_byte
              mov     H_byte,A
              clr     A
              addc    A,U_byte
              mov     U_byte,A
              mov     A,RW4
              add     A,U_byte
              mov     U_byte,A
              ret
    ;================================================================
              end

  • 相关阅读:
    使用 shell 脚本自动获取发版指标数据
    使用etcd选举sdk实践master/slave故障转移
    从零开始学Spark(一)
    Struts2被曝远程代码执行漏洞;叮咚买菜抢菜工具;find替代方案…|叨资讯
    从零开始学Spark(二)了解Spark
    7Zip 安全漏洞;FASTJSON 2.0 发布;程序员延寿指南…|叨资讯
    nodejs的TCP相关的一些笔记
    nodejs的tream(流)解析与模拟文件读写流源码实现
    nodejs的HTTP相关的一些笔记(代理服务、静态服务器工具)
    搭建Aira2实现个人离线下载
  • 原文地址:https://www.cnblogs.com/fensnote/p/13436525.html
Copyright © 2020-2023  润新知