我正在处理添加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到十六进制转换吗?
答案 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的范围内。