【问题标题】:Ascii to hex conversionASCII到十六进制转换
【发布时间】:2016-01-09 10:24:01
【问题描述】:

我正在编写用于添加 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到十六进制的转换吗?

【问题讨论】:

    标签: assembly


    【解决方案1】:

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

    从 30 hex 到 46 hex 的 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 转换为 hex,如果 ASCII 值大于 39 hex,则减 7,这样 A 到 F 现在对应 3a hex 到 3f hex 的 hex 值:

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

    然后您只需减去 30 十六进制,您的 ASCII 值将被转换为十六进制值 0-F。显然,这个算法只适用于大写表示。

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

    【讨论】:

    • “39 十六进制是 59 十进制”。 57.
    • @Michael 哎呀,是的
    • 处理小写的最后一步是一个and,用0xF而不是减去0x30。此时数字是 0x30 到 0x39,大写字母是 0x3A 到 0x3F 小写字母是 0x5A 到 0x5F。与 0xF 相加会为所有这些留下 0x0 到 0xF。
    • @dwelch 感谢您的帮助
    猜你喜欢
    • 2014-06-22
    • 2015-05-22
    • 1970-01-01
    • 2011-11-27
    • 2012-11-14
    • 2016-04-22
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多