将scanf与x86-64 GAS组件一起使用

问题描述 投票:2回答:1

我在尝试调用系统功能scanf以便在我的x86汇编程序中工作时遇到了很多问题。目前,我已经从标准中读取了它,但是,它只会读取chars而不会出现段错误(我不知道为什么,指定的字符串是%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以便在我的x86汇编程序中工作时遇到了很多问题。目前我已经从标准中读取了它,但是它只会读取...

assembly x86 scanf x86-64 gas
1个回答
4
投票

[您担心,movq %rcx, %rsi不正确。您需要传递一个指向内存的指针。寄存器不是存储器地址空间的一部分,因此您不能拥有指向它们的指针。您需要全局或本地分配存储。顺便说一句,您不应将数据(尤其是可写的)放入默认的.text部分,因为该部分用于代码,通常是只读的。同样,调用约定通常要求16字节堆栈指针对齐,因此您也应该注意这一点。

© www.soinside.com 2019 - 2024. All rights reserved.