为整数
问题描述:
我写了一个汇编程序(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
等等。
如果你们中的一些人对第二种情况下的问题有所了解,以及如何解决,我将不胜感激。
答
当你调用这个
; 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++;
对于输入您需要从文本转换为数字(与输出转换相反)。对于'0'输入,你得到'2608',因为你的输入是'0'的ASCII码,它是'48',后面跟着一个以'10'为代码的换行符,并且'48 + 10 * 256 = 2608'小端。 – Jester
@Jester所以在这种情况下,我必须从余数中减去48('0'的ASCII码)。那是对的吗?我错过了别的吗? – Jazz
是的,对于多位数字,您当然需要通过10的适当幂进行缩放,并且显然忽略换行。在输出期间你不这样做,这是一个输入转换,没有“余数”。 – Jester