NASM汇编:从ASCII转换为十进制

3

我知道你可以加上48来将十进制转换为ASCII码,或者减去48来将ASCII码转换为十进制,但是为什么下面的代码也执行了同样的转换呢?

; moving the first number to eax register and second number to ebx
; and subtracting ascii '0' to convert it into a decimal number
mov eax, [number1]
sub eax, '0'

并且

; add '0' to to convert the sum from decimal to ASCII
add eax, '0'

你应该谈论数字,而不是数值。 - mike.dld
只要 eax 中的数字是介于 09 之间的单个十进制数字,它就能正常工作。因为 ASCII 的 '0' 减去 '0' 等于数字 0,ASCII 的 '1' 减去 '0' 等于数字 1,以此类推。如果您有更大的数字,您需要逐位转换。 - lurker
参考链接:https://duckduckgo.com/asciitable.html - mike.dld
好的,所以基本上是在ASCII中执行加法和减法。这很有道理,谢谢。 - nerdPollution
1个回答

6

'0'48的作用是相同的,因为'0'是代表字符0的代码点,在ASCII中,它确实是48

因此,所有这些都是等价的:

sub  al, 48          ; decimal
sub  al, '0'         ; character code
sub  al, 30h         ; hex
sub  al, 0x30        ; hex again
sub  al, 60q         ; octal
sub  al, 00110000b   ; binary

请注意,此方法仅适用于值从09(包括边界)的情况。如果您想处理大于九的值,则需要将该值分解为单个数字,并逐个处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接