标题: 求一个汇编程序,如何将单字节16进制数00-FF转为3个字节的ASCII码保存在不同地址 [打印本页]

作者: lhxr    时间: 2018-11-7 16:35
标题: 求一个汇编程序,如何将单字节16进制数00-FF转为3个字节的ASCII码保存在不同地址
如何将单字节16进制数00-FF转为3个字节的ASCII码,保存在地址10H,11H,12H三个地址中(按格式000-255占3个字节)

作者: Y_G_G    时间: 2018-11-8 00:10
你这个问题有问题,比如说,我有一个16进制的的数:50,它是存放在一个的16位的地址中,那问题来了:所谓"转换成3个字节的ASCII码"什么意思,50的ASCII是"2",那我是要转换成"002"还是"050",我怎么放到你说的这三个地址中??
你干脆说你要干嘛就得了
作者: zl2168    时间: 2018-11-8 09:00
这是老师布置的习题,答案书上有的。介绍你2本书,张志良编著的《单片机原理与控制技术——双解汇编和C51》第3版ISBN 978-7-111-42393-5机械工业出版社。《单片机学习指导及习题解答——双解汇编和C51》第2版ISBN 978-7-111-42431-4机械工业出版社。后书是前书的配套教材,但也可单独使用。
作者: lhxr    时间: 2018-11-8 09:16
我想让一个16进制递增或递减,然后通过串口发送,串口发送的是5个字节:41 31 35 37 56,字符串就是A157V,比如16进制数80H,对应的十进制是128,ASCC的3字节表示是31H,32H,38H,怎么把16进制的数80H变为3个字节31H,32H,38H
作者: Y_G_G    时间: 2018-11-8 10:30
你直接说128变成"1","2","8",再转换成"1","2","8"对应的ASCII码发送不就好了.
一,先把128除以100,得到百位1,余数就是28,再除以10,得到十位2,余数就是8了,分别放到三个地址,就是"1","2","8"了
二,把这个值再加10进制的48就可以了,因为,ASCII码的0是48,之后都是连续的数,直接运算就可以了
比如: f是102,分解出来就是"1","0","2",一样的处理就可以了
作者: sxhwdz    时间: 2018-11-8 10:45
汇编程序,16进制数存放 bin,  ascii 百位 bai, 十位 shi, 个位 ge:

                        MOV      A,bin        ; 16进制数
                        MOV      B,#100
                        DIV       AB
                        ADD      A,#0x30
                        MOV      bai,A       ;百位

                        MOV      A,B
                        MOV      B,#10
                        DIV       AB
                        ADD      A,#0x30
                        MOV      shi,A           ; 十位

                        MOV      A,B
                        ADD      A,#0x30
                        MOV     ge,A           ; 个位

C程序语句:

        bai = bin/100 +0x30;
        shi = bin%100/10 +0x30;
        ge  = bin%10 +0x30;

作者: lhxr    时间: 2018-11-8 11:46
非常谢谢sxhwdz ,按你的已经编译通过
作者: lhxr    时间: 2018-11-8 11:49
非常感谢大家的帮助
作者: yzwzfyz    时间: 2018-11-8 13:24
;格式转换类BIN→BCD----
BINTOBCDA1:     DB      00H, 16H, 32H, 48H, 64H, 80H, 96H, 12H
;BINTOBCDA.ASM:单字节BIN→BCD,A→A。(A.7自动去除,低7位<100)
;影响:PSW,A,B。
BINTOBCDA:      PUSH    DPH
                PUSH    DPL
                PUSH    ACC
                SWAP    A
                ANL     A, #C_07H
                MOV     DPTR, #BINTOBCDA1
                MOVC    A, @A+DPTR
                MOV     DPL, A
                POP     ACC
                ANL     A, #C_0FH
                ADD     A, #0
                DA      A
                ADD     A, DPL
                DA      A
                POP     DPL
                POP     DPH
                RET     
;A_TOBCD_BA.ASM:单字节BIN→BCD,A→BA。
;影响:PSW,A,B。
A_TOBCD_BA:     PUSH    ACC
                ANL     A, #C_3FH
                CALL    BINTOBCDA                   ;先处理低6位<64
;再处理高二位
                POP     B
                ANL     B, #11000000B               ;只留两个可能产生>99的位
                JBC     B.6, A_BCD_BA1              ;需要+64
                JMP     A_BCD_BA2
;B.6=1则BA+64
A_BCD_BA1:      ADD     A, #C_64H
                DA      A
                JNC     A_BCD_BA2
                INC     B                           ;进位到百
A_BCD_BA2:      JBC     B.7, A_BCD_BA3              ;需要+128
                JMP     A_BCD_BA4
;B.7=1则BA+128
A_BCD_BA3:      ADD     A, #C_28H
                DA      A
                XCH     A, B                        ;百位交换到A
                ADDC    A, #C_1                     ;百位+100并带进位
                XCH     A, B                        ;百位换回
A_BCD_BA4:      RET     
作者: yzwzfyz    时间: 2018-11-8 13:26
需要你增加定义:
C_XX
作者: yzwzfyz    时间: 2018-11-8 13:28
需要你增加定义:
C_??      EQU     ??      ;??是数字。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1