0

我对组装很陌生。我知道如何从用户那里获取 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。

4

1 回答 1

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

像你一样推送和弹出不是写这个的常用方法,但这样也没有错。如果调用约定需要,请记住保持堆栈对齐。

于 2013-10-07T10:42:28.440 回答