Assembly x86 alp中的十六进制到Ascii转换
我目前正在学习alp(x86)。我最近偶然发现了一个程序,该程序用于显示存储在数组中的字符,基本上是十六进制形式。为了显示字符,我们应该将其转换为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
;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码,以及它们与所代表的值的比较。