将用户输入读为整数

时间:2017-05-08 22:23:17

标签: linux assembly nasm x86-64

我编写了一个汇编程序(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 :(得分:1)

当你打电话给这个时发生的事情

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

是,您的条目(例如“1004”)以每个字符的“数字”字符写入内存。现在你有一个与之打算完全相反的问题: “如何将ASCII字符串转换为二进制值”

这个新问题的算法可能如下所示:

sprintf()