I wrote an Assembly program (x86_64 Linux NASM) that prints an integer to console, based in the algorithm suggested my the comments in this post, which is basically this:
divide number x by 10, giving quotient q and remainder r emit r if q is not zero, set x = q and repeat
All works just fine under the following script:
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.
After compiling it, the number 567
gets printed on the screen (console).
But if I try to do the same but allowing the user to input the number to be printed as integer I don’t get what expected. Well, to do this I made the following changes (the algorithm stays the same):
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.
But in this case if I type 567
I get 171390517
. In fact, if I type
0, I get 2608 1, I get 2609 2, I get 2610
and so on.
I’d appreciate if some of you have an idea about what is the problem in the second case and how could be fixed.
Advertisement
Answer
what happends when you call this
; getting user input mov rax, 0 mov rdi, 0 mov rsi, number mov rdx, 100 syscall
is, that your entry ( e.g. “1004”) is written to the memory at “number”, character per character. Now you have the exact opposite problem you intended to solve: “how to convert an ASCII string into binary value”
the algorithm for this new problem could look like this:
(assuming char_ptr points to the string) result = 0; while ( *char_ptr is a digit ) result *= 10; result += *char_ptr - '0' ; char_ptr++;