【发布时间】:2015-01-21 14:26:06
【问题描述】:
我在尝试调用系统函数 scanf 以在我的 x86 汇编程序中工作时遇到了很多问题。目前我已经从标准中读取它,但是它只会读取没有段错误的字符(我不知道为什么,指定的字符串是 %d)。我在 x86 在线看到的 scanf 示例使用 quarky 或使用 NASM 语法编写,因此我尝试将它们改编为我的程序。
f:
.string "%d"
_main:
movq $0, %rax #Clean rax
movq $f, %rdi #Load string format
movq %rcx, %rsi #Set storage to rcx (Not sure if this is valid)
call scanf
ret
在输入字符或字符串后,使用 printf 检查 rcx 和 rax 分别返回 1 和 0(只有这样程序不会出现段错误)。
非常感谢任何有关如何在 x86 气体组装中正确使用 scanf 的见解!
【问题讨论】:
-
scanf是一个标准库函数,而不是“系统函数”。对于第二个参数,它需要一个存储结果的内存地址。您可以将寄存器值移动到 RSI 并期望它将数据存储在前一个寄存器中 - 这没有任何意义。使用 LEA。
标签: assembly x86 scanf x86-64 gnu-assembler