我有一些使用 scanf 和 printf 的汇编代码,但遇到了一些问题。当这两个函数在同一代码中使用时,寄存器中的值似乎会丢失。该程序基本上加载一个数字并将其打印出来。我们使用
nasm -f elf64 file.asm && gcc -o file file.o && ./file
在 Linux 上
这是我们的代码:
extern printf
extern scanf
section .data
a db "set: ", 0
b db "not set: ", 0
reading db "Please enter a number: ", 0
message db "\n", 0
printsent db "%s", 10, 0
printint db "%d", 10, 0
printchar db "%c", 10, 0
readInt db "%d", 0
input db "%d", 0
section .text
global main
main:
hatta:
push rbp,
mov rbp, rsp,
push rbx,
xor rax, rax,
mov rdi, printsent,
mov rsi, reading
call printf,
pop rbx,
xor rax, rax,
mov rdi, readInt,
call scanf,
mov rbx, rdi
push rbx,
xor rax, rax,
mov rdi, printint,
mov rsi, rbx,
call printf,
pop rbx,
pop rbp,
ret
奇怪的是,如果mov rdi, printint,
删除该行,我们会获得正确的值。然而,如果我们对 printsentence 做同样的事情,我们会得到一个分段错误。谁能告诉我们这样做的原因?
谢谢!