如何在汇编中接收用户的多个输入

时间:2013-10-07 03:50:15

标签: assembly input 64-bit nasm

我对装配很新。我知道如何从用户那里获取1个值,但如果我希望用户输入由空格分隔的3个数字,该怎么办呢。

我正在尝试将它们中的每一个存储到一个单独的寄存器中,所以就像这样。

push qword 0                        ;make space for 8-byte number
push qword 0                        ;make space for 8-byte number
push qword 0                        ;make space for 8-byte number                                            
mov qword  rdi, formatfloatinput                            
mov qword  rsi, rsp                                         
mov qword  rax, 0                                           
call       scanf                                            


pop qword r15                   ;pop value from stack into r15                            
pop qword r14                   ;pop next value in stack into r14?
pop qword r13                   ;pop next value in stack into r13?

示例输入:13 15 36

现在r15应该包含13个,r14包含15个,r13包含36个。

1 个答案:

答案 0 :(得分:2)

C等价物为scanf("%ld %ld %ld", &r15, &r14, &r13)。请注意,您必须将3个指针传递给每个输出变量。您只传递1.此外,您的formatfloatinput具有误导性,您正在读取整数寄存器,您需要一个整数格式。这样的事情应该有效:

push qword 0                        ;make space for 8-byte number
push qword 0                        ;make space for 8-byte number
push qword 0                        ;make space for 8-byte number
mov qword  rdi, format
mov qword  rsi, rsp                 ; &r15
lea rdx, [rsp+8]                    ; &r14
lea rcx, [rsp+16]                   ; &r13
mov qword  rax, 0
call       scanf
pop qword r15                   ;pop value from stack into r15
pop qword r14                   ;pop next value in stack into r14?
pop qword r13                   ;pop next value in stack into r13?
....
format: db "%ld %ld %ld", 0
像你一样推送和弹出不是写这个的常用方法,但并没有错。如果调用约定要求,请记住保持堆栈对齐。