【问题标题】:How to take in multiple inputs from user in assembly如何在汇编中接受用户的多个输入
【发布时间】:2013-10-07 03:50:15
【问题描述】:

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

【问题讨论】:

    标签: assembly input 64-bit nasm


    【解决方案1】:

    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
    

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

    【讨论】:

    • 完美运行。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多