把一位16进制数转化为对应的ASCII码。

功能:把1位16进制数转换为对应的ASCII码
入口参数:al的低4位为要转换的16进制数
出口参数:al含对应的ASCII码
htoasc proc
and al,0fh
add al,90h ------->从这里起后面的不懂,给解释下。
daa
adc al,40h
daa
ret
htoasc endp

补充:之前第一段话说的有问题,所以修改了下,如下:(另外提交的时候没注意,第一个兄弟的回答已经是正确的了^_^)
主要思想是0~9转为对应的ASCII码时加30h,而a,b,c,d,e,f则加37h,比30h多出来的7h就是通过adc(多加了CF的01h)以及daa(多加了06h)实现的。

先说对0~9的,以5为例,
and al,0fh
add al,90h
变为95h
daa
这个时候的daa,由于95h低位,高位都小于9,且无进位,所以不变
adc al,40h
95h + 40h + CF = D5h
daa
低位不变,高位大于9,所以加60h,变为35h,且CF = 1
最终结果为35h,即字符5对应的ascii码53.

然后是A~F,以C为例:
and al,0fh
add al,90h
变为9Ch
daa
这个时候的daa,先看低位,由于低位是C,大于9,所以加06h,结果变为A2h,再看高位,高位A,大于9,所以加60h,变为02h,CF = 1(有进位)

adc al,40h
adc操作,02h + 40h + CF = 43h
daa
此时43h低高位都小于9,所以无变化。最后结果43h,也即C的ASCII码67
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-01-25
这段程序的难点就是DAA的作用:
如果AL的低4位大于9或AF=1,则AL的内容加06H,并将AF置1;然后如果AL的高4位大于9或CF=1,则AL的内容加60H,且将CF置1。如果两个都不满足,则将AF,CF清零。

1. 如果al的值是0-9,那么:
add al,90h ---------al变成90-99H
daa ---------al不变
adc al,40h ---------al为d0-d9
daa ---------al加上60H,变成30-39H,正是0-9的ASCII码。
2. 如果al的值是A-F,那么:
add al,90h ---------al变成9A-9FH
daa ---------al加6,高4位变A,所以再加60H,成00-05,且CF=1
adc al,40h ---------al为41-46H,正是A-F的ASCII码。
daa ---------al不变
第2个回答  2011-01-25
理解DAA的操作,就不难明白
以下截取自INTEL手册,应该已经很清楚了,无需更多描述

old_AL <- AL;
old_CF <- CF;
CF <- 0;
IF (((AL AND 0FH) > 9) or AF <- 1)
THEN
AL <- AL + 6;
CF <- old_CF or (Carry from AL <- AL + 6);
AF <- 1;
ELSE
AF <- 0;
FI;
IF ((old_AL > 99H) or (old_CF = 1))
THEN
AL <- AL + 60H;
CF <- 1;
ELSE
CF <- 0;
FI;
第3个回答  2022-04-04

16 进制 0~9:加上 48,即转换成为 ‘0’~‘9’。

16 进制 A~F:加上 55,即转换成为 ‘A’~‘F’。

为了实现转换,下面的程序,是最简单的了:

  CMP AL, 10

  JC J_48

  ADD AL, 7

J_48: ADD AL, 48

  RET

楼主给出的程序,也能实现转换。

但是,需要多理解一条指令(DAA),编程思路就太麻烦了。

第4个回答  2011-01-25
这是什么语言代码?

把一位16进制数转化为对应的ASCII码。
此时43h低高位都小于9,所以无变化。最后结果43h,也即C的ASCII码67

如何将一个16进制数转换为ASCII码?
要将16进制数转换为ASCII码,可以按照以下步骤操作:1. 将16进制数中的每个数字字符转换为十进制。例如,16进制中的'f'对应十进制中的15。2. 将每个字母字符转换为其ASCII码值。大写字母转换为十进制时,需要加上0x30(即56),小写字母转换时则加上0x37(即55)。例如,16进制中的'a'转换为十...

如何把16进制数转换为对应的ASCII字符?
谢谢各位关注,我在做一个单片机上的console程序,单片机通过串口和上位机通讯,指令和返回数据全部采用ASCII码,由于需要反馈一些寄存器数据——这些数据是16进制的,通过串口输出时我想把它们变成ASCII码方便阅读。例如,十六进制0x4A,转换为ASCII字符 ‘4’和‘A’,而不是得到这个十六进制对应的ASCII,比如0x4A='J'请各位...

如何把一位16进制的数转换成对应的ASCII码 2
此时43h低高位都小于9,所以无变化。最后结果43h,也即C的ASCII码67

单片机,C语言编程将16进制转换为ASC码
假设16进制是0—9,那么:16进制数 + '0' = 16进制数对应的ASCII码30H—39H 16进制的A--F,可以类似的变换。

跪求高手解答!!!16进制密匙转为ASCII!!!
30 30 32 41 31 30 35 36 37 43 39 32 31 36 31 35 46 41 38 41 31 46 39 31 46 33 45 41 39 34 45 33 35 44。以上是你那一串16进制数用16进制表示的ASCII码。如果通不过的话,把其中的4改为6。你可以自己算呀,凡数字,+0x30,凡字母,+0x37(大写)或+0x57(小写)。

用汇编怎么将16进制转ASCII码?
1. 首先,我们需要了解16进制数`1aH`转换为ASCII码的过程。2. 在汇编语言中,大写字母`A`到`F`对应的ASCII码值分别是`31h`到`36h`,小写字母`a`到`f`对应的ASCII码值分别是`61h`到`66h`。3. 因此,16进制数`1aH`转换为ASCII码值是`31h`和`41h`。4. 具体的计算过程是:如果16进制...

汇编语言 十六进制转换为ASCII码
BUF 子单元的的 每个字节的 16 进制数 加上 30h

怎么将16进制转换成ASCII码?
a的16进制是1010,加0x37即1010+00110111=01000001=0x41;d的16进制是1101,加0x37即1101+00110111=01000100=0x44;1的16进制是0001,加0x37即0001+00110111=00110001=0x31;e的16进制是1110,加0x37即1110+00110111=01000101=0x45。所以16进制数fad1e的ASCII码就是:46 41 44 31 45。其他的你就...

一位十六进制数值和对应的ascii码值相差多少
十六进制数值为0~F,其中0~9的ASCII值为30h~39h,相差30h,而A~F的ASCII值为41h~46h,相差37h。所以要分成两段来处理。如果还需要处理a~f(ASCII值为61h~66h)的话,则还要判断字母的大小写。

相似回答