【发布时间】:2017-10-07 01:51:45
【问题描述】:
我编写了一个汇编程序 (x86_64 Linux NASM),它根据post 中建议我的 cmets 的算法将整数打印到控制台,基本上是这样的:
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
等等。
如果你们中的一些人知道第二种情况的问题是什么以及如何解决,我将不胜感激。
【问题讨论】:
-
对于输入,您需要将文本转换为数字(与输出转换相反)。对于
0输入,您将得到2608,因为您的输入是0的ascii 代码,即48,后跟代码10的换行符,这将给出48+10*256=2608的小端序。 -
@Jester 所以在这种情况下,我必须从余数中减去 48(
0的 ASCII 码)。那是对的吗?我还缺少其他东西吗? -
是的,对于多个数字,您当然需要按 10 的适当幂进行缩放,并且显然忽略换行。您在输出期间不要这样做,这是一个输入转换,没有“剩余”。
-
@Jester 我是大会的新手,所以我想正确了解多个数字。从你所说的我推断出用户的输入是一次“获取”一个字节(数字)(可能是一个有点愚蠢的问题。现在我正在考虑如何输出数字:逐个数字)。例如,如果用户输入
345,他确实首先输入51(3的ASCII)然后52,最后输入53。所以在内存intAddress我持有51,在intAddress + 1我们有52和intAddress + 353。 (我的评论太长,所以我也写在下面)。 -
通常的技巧是将工作值乘以 10,然后添加新数字。只要你有数字就重复。例如。你将拥有
((51-48)*10+(52-48))*10+(53-48)
标签: linux assembly nasm x86-64