Assembly x86 alp中的十六进制到Ascii转换

Assembly x86 alp中的十六进制到Ascii转换,assembly,x86-64,Assembly,X86 64,我目前正在学习alp(x86)。我最近偶然发现了一个程序,该程序用于显示存储在数组中的字符,基本上是十六进制形式。为了显示字符,我们应该将其转换为ascii,然后再显示它们 ;display procedure for 64bit display: mov rsi,char_answer+15 mov rcx,16 cnt: mov rdx,0 mov rbx,16h div rbx

我目前正在学习alp(x86)。我最近偶然发现了一个程序,该程序用于显示存储在数组中的字符,基本上是十六进制形式。为了显示字符,我们应该将其转换为ascii,然后再显示它们

    ;display procedure for 64bit
     display:
    mov rsi,char_answer+15
    mov rcx,16
    cnt:    mov rdx,0
            mov rbx,16h
            div rbx
            cmp dl,09h
            jbe add30
            add dl,07h
    add30:    add dl,30h
            mov [rsi],dl
            dec rsi
            dec rcx
            jnz cnt
    scall 1,1,char_answer,16
    ret
所以在上面的代码中,我无法理解为什么我们要比较09h,然后再加上30h或07h


谢谢。

在ASCII及其后续版本中,十进制数字映射范围为0x30..0x39,前六个字母(用作十六进制数字10到15)映射范围为0x41..0x46。一旦程序提取了一个十六进制数字,为了将其转换为表示其值的ASCII码,如果该数字在0..9范围内,则需要添加0x30;如果该数字在a..F范围内,则需要添加0x41-0x0A=0x37


这是汇编语言中的一种常见习惯用法。

在ASCII及其后继者中,十进制数字映射范围为0x30..0x39,前六个字母(用作十六进制数字10到15)映射范围为0x41..0x46。一旦程序提取了一个十六进制数字,为了将其转换为表示其值的ASCII码,如果该数字在0..9范围内,则需要添加0x30;如果该数字在a..F范围内,则需要添加0x41-0x0A=0x37


这是汇编语言中的一个常见习惯用法。

想想要打印的字符的ASCII码,以及它们与所代表的值的比较。想想要打印的字符的ASCII码,以及它们与所代表的值的比较。