为整数

问题描述:

我写了一个汇编程序(x86_64的Linux的NASM)读取用户输入打印整数安慰,总部设在算法提出我的意见在这个post,这基本上是这样的:为整数

divide number x by 10, giving quotient q and remainder r 
emit r 
if q is not zero, set x = q and repeat 

所有下面的脚本下工作得很好:

section .bss 
     integer resb 100  ; it will hold the EOL 
     intAddress resb 8  ; the offset 

section .text 

     global _start: 

_start: 

     mov rax, 567 
     call _printProc 

     mov rax, 60 
     mov rdi, 0 
     syscall 


_printProc: ; here goes the algorithm described above. 

编译它之后,数567获取打印屏幕(控制台)上。

但是,如果我尝试做同样的事情,但允许用户输入要打印的数字作为整数,我没有得到预期的结果。好了,为此,我做了如下修改(算法保持不变):

section .bss 
     integer resb 100  ; it will hold the EOL 
     intAddress resb 8  ; the offset 
     number resb 100 

section .text 

     global _start: 

_start: 

     ; getting user input 
     mov rax, 0 
     mov rdi, 0 
     mov rsi, number 
     mov rdx, 100 
     syscall 

     mov rax, [number]  ; passing the content at address number into rax 
     call _printProc 

     mov rax, 60 
     mov rdi, 0 
     syscall 


_printProc: ; here goes the algorithm described above. 

但在这种情况下,如果我型我567得到171390517。实际上,如果我输入

0, I get 2608 
1, I get 2609 
2, I get 2610 

等等。

如果你们中的一些人对第二种情况下的问题有所了解,以及如何解决,我将不胜感激。

+1

对于输入您需要从文本转换为数字(与输出转换相反)。对于'0'输入,你得到'2608',因为你的输入是'0'的ASCII码,它是'48',后面跟着一个以'10'为代码的换行符,并且'48 + 10 * 256 = 2608'小端。 – Jester

+0

@Jester所以在这种情况下,我必须从余数中减去48('0'的ASCII码)。那是对的吗?我错过了别的吗? – Jazz

+1

是的,对于多位数字,您当然需要通过10的适当幂进行缩放,并且显然忽略换行。在输出期间你不这样做,这是一个输入转换,没有“余数”。 – Jester

当你调用这个

; getting user input 
    mov rax, 0 
    mov rdi, 0 
    mov rsi, number 
    mov rdx, 100 
    syscall 

是,你的条目(例如“1004”)在“数量”写入存储器什么happends,每个字符的字符。现在,你有打算解决完全相反的问题: “如何将ASCII字符串转换为二进制值”

算法为这个新的问题看起来是这样的:

(assuming char_ptr points to the string) 
result = 0; 
while (*char_ptr is a digit) 
    result *= 10; 
    result += *char_ptr - '0' ; 
    char_ptr++;