把一位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
这是什么语言代码?