NASM x86_64 scanf分段故障

时间:2014-11-12 14:45:46

标签: assembly nasm x86-64

我是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

提前致谢!

1 个答案:

答案 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字节边界。