汇编ASCII码到十进制(BCD)的转换

汇编ASCII码到十进制(BCD)的转换,第1张

EXTRN LOAD:FAR,SAVE:FAR

N EQU 20

DSEG SEGMENT

SOURCE DB N DUP()

RESULT DB N/2 DUP(0)

NAME0 DB 'INPUT1DAT',0

NAME1 DB 'OUTPUT1DAT',0

DSEG ENDS

SSEG SEGMENT STACK

DB 256 DUP()

SSEG ENDS

CSEG SEGMENT

ASSUME CS:CSEG, SS:SSEG, DS:DSEG

START PROC FAR

PUSH DS

XOR AX,AX

PUSH AX

MOV AX,DSEG

MOV DS,AX

MOV ES,AX

LEA DX,SOURCE

LEA SI,NAME0

MOV CX,N

CALL LOAD

; BEGIN

MOV CX,0

LEA BX,SOURCE

NEXT: MOV AL,[BX]

CMP AL,0

JZ GOON

INC CX

INC BX

JMP NEXT

GOON: LEA SI,SOURCE

LEA DI,RESULT

ROR CX,1 ;是偶数吗?

JNC EVN ;是

ROL CX,1 ;否

LODSB

AND ____(1)__AL__,0FH

STOSB

DEC CX

ROR CX,1

EVN: LODSB

AND ____(2)_AL___,0FH

MOV BL,AL

LODSB

PUSH CX

MOV CL,___4_(3)____

SAL AL,___CL_(4)____

POP CX

____(5)_OR___ AL,BL

STOSB

LOOP EVN

; END

EXIT: LEA DX,RESULT

LEA SI,NAME1

MOV CX,N/2

CALL SAVE

RET

START ENDP

CSEG ENDS

END STA

★此程序要首先理解什么是压缩的BCD码。压缩的BCD码就是一字节存放两位BCD码。还要懂得如何将十进制的ASCII码转换成BCD码。考查了ROR,ROL,LODSB,STOSB等指令的用法。

程序的数据段中定义了四个字节型变量,原始数据区SOURCE、结果数据区RESULT、原始数据文件名NAME0、结果数据文件名NAME1。数据段下面是堆栈段,定义了一个256个字节的堆栈区。堆栈段下面是代码段,告诉汇编程序,代码段、数据段和堆栈段分别属于段寄存器CS、DS、SS。

先来看NEXT这一段程序,将BX中的内容送AL中。BX是原始数据的偏移地址,其初值为0。将AL与末尾字符0比较,若相等,则转向GOON段;否则,CX和BX都加1,继续转向NEXT段。所以NEXT段的作用是统计ASCII码字符的个数,用CX来表示。

GOON段,先将原始数据的偏移地址送SI中,结果数据存放的偏移地址送DI中。开始判断ASCII码字符的个数即CX为奇数还是偶数。将CX循环逻辑右移一位,将最低位移入CF中。由CF来判断CX的奇偶性。若CF=0,表示CX为偶数,则转向ECN段;否则,CX为奇数时,将CX循环逻辑左移一位,CX恢复原值。再用LODSB指令将由SI作为地址指针的串元素装入到AL中,同时修改SI,指向下一个元素。

第(1)空中,当CX为奇数时,要将地址最低的ASCII码即第一个ASCII码按照非组合BCD码格式转换,即一个字节只存第一个的BCD码。所以只需将AL的高四位屏蔽掉,再用STOSB指令将AL存储到DI中。

EVN段,当ASCII码字符个数CX为偶数时,接连取两个数,将前一个数AL(如34H)的高四位屏蔽掉,并赋值给BL(04H);再用LODSB指令取下一个数AL(如35H),将AL算术左移四位,原来的低四位移入到高四位,低四位变成0(得到50H)。所以第(2)、(3)、(4)分别填写“AL”,“4”,“CL”。

第(5)空是将转换后的两个BCD码相或 *** 作,就变成了压缩BCD码(54H)。所以第(5)空填写“OR”。

首先将ASCII码化成十进制,想直接到BCD不行

BCD码有8421、2421等 一般多用8421型的

是什么意思呢,举个例子(8421):比如8(BCD)=1000 即8X1+4X0+2X0+1X0=8

(2421):8(BCD)=1110

道理都是一样的。单位的十进制就像上面一样,

那么像2156BCD (8421)=0010 0001 0101 0110

以上是有权BCD码

还有就是无权BCD码,像余三码,格雷码等, 其中余三码用的普遍一些

像余三码 就是在有权码的基础上加3即0011 B

举个例子:456(余三码)=0111 1000 1001 什么意思?

就是4(8421) +0011=0100+0011=0111

以此类推,后面都是一样 。

像汇编语言,有人说可以,但我不知道该从哪方面说。我不否认,因为汇编语言写出来之后是经过计算机处理的,计算机的程序是经过人大脑的,理性思维,这个转换过程一定要经过十进制的转换,不过,在计算机中,十进制都以二进制的形式存储的,但这个转换过程,在设计时,头脑要考虑的。也就是说,在汇编语言写进微机中隐形中有十进制的转换 。

首先51单片机是8位的,BCD转换ASCII是不是把16进制数转成字符,如0X23变成"23",ASCII的‘0-9’是0X30-0x39,先把高位4位取出加上0x30就转成ASCII,然后是低4位,ASCII的‘A-F’是0X65-0x70,如果数是字母,取出数加上0x65-10;

以上就是关于汇编ASCII码到十进制(BCD)的转换全部的内容,包括:汇编ASCII码到十进制(BCD)的转换、如何把ASCII码转换成BCD码、51单片机 BCD转换ASCII等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10113905.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存