【问题标题】:How can I call sprintf from x86_64 assembly?如何从 x86_64 程序集调用 sprintf?
【发布时间】:2010-08-20 18:07:53
【问题描述】:

我正在尝试将 x86_64 汇编代码中的 double 转换为堆栈上的字符串:

        bs.code += isa.movsd(registers.xmm0, MemRef(registers.rsp))
        bs.code += isa.pop(registers.rax)

        bs.code += isa.push(registers.rbp)
        bs.code += isa.mov(registers.rbp, registers.rsp)

        bs.code += isa.sub(registers.rsp, 100)
        bs.code += isa.and_(registers.rsp, -16)

        bs.code += isa.mov(registers.rdi, registers.rsp)
        bs.code += isa.mov(registers.rsi, <address of "%i\0">)
        bs.code += isa.mov(registers.rax, <address of sprintf in libc>)
        bs.code += isa.call(registers.rax)

call(rax) 处的程序段错误

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff6a2919b in *__GI___overflow (f=0x7fffffffb5d0, ch=9698128) at genops.c:248
warning: Source file is more recent than executable.
248   return _IO_OVERFLOW (f, ch);

我认为必须特别调用sprintf,因为它使用可变参数,所以任何人都可以建议从汇编中执行此操作的正确方法吗?

【问题讨论】:

    标签: assembly x86-64 variadic-functions


    【解决方案1】:

    如果您在 C 中编写一个对 sprintf 的简单调用并使用 gcc -s foo.c 会有帮助吗?

    【讨论】:

    • 我试过了,但必须使用 -fno-stack-protector 来获得简单的代码。
    猜你喜欢
    • 2014-05-02
    • 2017-06-18
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2021-02-14
    相关资源
    最近更新 更多