我是nasm的新手,我真的想学习如何使用用户输入来存储数字。使用scanf时,我无法摆脱分段错误。我在网上搜索过,但还没有找到解决这个问题的方法。 我试过这个code,但它对我不起作用。
有人可以解释一下我做错了什么吗?
global main
extern printf, scanf
section .data
msg: db "Enter a number: ",10,0
format:db "%d",0
section .bss
number resb 4
section .text
main:
mov rdi, msg
mov al, 0
call printf
push number
push format
call scanf
ret
提前致谢!
答案 0 :(得分:4)
x86-64 calling convention通常不会推动论证。此外,您必须告诉函数具有可变的参数计数,您提供的浮点参数数量。
这有效:
global main
extern printf, scanf
section .data
msg: db "Enter a number: ",10,0
format:db "%d",0
section .bss
number resb 4
section .text
main:
sub rsp, 8 ; align the stack to a 16B boundary before function calls
mov rdi, msg
mov al, 0
call printf
mov rsi, number
mov rdi, format
mov al, 0
call scanf
add rsp, 8 ; restore the stack
ret
BTW:如果你想使用浮点数,你必须在调用函数之前将堆栈对齐到16字节边界。