把一位16进制数转化为对应的ASCII码。
发布网友
发布时间:2022-04-23 02:11
我来回答
共5个回答
热心网友
时间:2022-04-24 06:36
补充:之前第一段话说的有问题,所以修改了下,如下:(另外提交的时候没注意,第一个兄弟的回答已经是正确的了^_^)
主要思想是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
热心网友
时间:2022-04-24 07:54
4个2进制位为一个16进制数,2进制1111为16进制F,2进制中千位的1=8,百位的1=4,十位的1=2,个位的1=1,将各个位的数作相应转换再相加,的到的数就是10进制数0-15,可轻松转换成16进制。如01011100,可看成是两组2进制数0101和1100,则这个数就是16进制的5C。
10转16:
100以内一点的10转16心算比较快,复杂的用“计算器”算了。10转16用传统的计算方式可以了,就是大于15小于256的10进制数除以16为的值为十位的16进制数,其余数为个位的16进制数,没余数则个位为0。如61的16进制是3D,61除以16得3余13,3作十位数,13转成D为各位数。
16转10:
用相反的道理,将十位数乘以16加上个位数。如5A,将5乘以16得80,加上A的10进制10,结果是90。
热心网友
时间:2022-04-24 09:28
这段程序的难点就是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不变
热心网友
时间:2022-04-24 11:20
;假设x,已经在r2中。
mov
a,
r2
;取来x
clr
c
subb
a,
#3ah
jc
end_c
subb
a,
#07h
end_c:
add
a,
#0ah
;转换后的十六进制数,在a中。
ret
就这些。
热心网友
时间:2022-04-24 13:28
理解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;