Ascii到十六进制转换

时间:2016-01-09 10:24:01

标签: assembly

我正在处理添加n个十六进制数字的代码。 这是我没有得到的代码的一部分

packnum:

xor bl,bl

mov ecx,02      ; For two digit numbers

mov esi,numascii


up1:

rol bl,04           ; Multiply by 10

mov al,[esi]

cmp al,39h

jbe skip

sub al,07h


skip:
sub al,30h

add bl,al

inc esi

loop up1

ret

为什么比较al和39h? 如果不等于为什么从al减去07h?这是ascii到十六进制转换吗?

1 个答案:

答案 0 :(得分:3)

39十六进制是十进制57,这是数字9的ASCII值。

从30十六进制到46十六进制的ASCII值为:

0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F
30                39              41        46 (hex)

数字0到9是ASCII 30 hex到39 hex,A到F是ASCII 41 hex到46 hex。

9和A之间有7个字符,您需要考虑这些字符。因此,要将ASCII转换为十六进制,如果ASCII值大于39十六进制,则减去7,这样A到F现在对应于3a hex到3f hex的十六进制值:

0 1 2 3 4 5 6 7 8 9 A B C D E F
30                            3f (hex)

然后你可以减去30十六进制,你的ASCII值将被转换为十六进制值0-F。显然,该算法仅适用于大写表示。

正如在评论中所提到的那样,你可以通过ANDing和0xf来处理大写和小写,而不是减去0x30,因为大写字母将在0x3a到0x3f的范围内,小写字母将在0x5a到0x5f的范围内。