【问题标题】:Printf Assembly Language Stack pointer nasm intelPrintf 汇编语言堆栈指针 nasm intel
【发布时间】:2014-10-09 02:38:30
【问题描述】:

设置:Nasm intel 64bit ubuntu 包含 printf 行时出现分段错误。不包括它编译并运行良好。我只是想在这段代码中打印 1 。

调用 printf 是否打印堆栈指针处的任何内容? 在这里调用 printf 时,DD2 会在堆栈指针处吗?

我刚刚弹出最后两项以使堆栈返回其初始位置。

感谢所有帮助,祝您有个愉快的夜晚!

SECTION .data
DD:
    db 1
DD2:
    db "%d"
extern printf

SECTION .text
global main

main:
    push DD
    push DD2
    call printf
    pop rax ; 
    pop rbx ;

    ret

【问题讨论】:

    标签: assembly nasm


    【解决方案1】:

    64 位的调用约定与 32 位的调用约定大不相同。

    http://en.wikipedia.org/wiki/X86_calling_conventions

    向下滚动到 x86-64,它会告诉您前 6 个参数是在寄存器中传递的: RDI 中的第 1 个参数,RSI 中的第 2 个参数,RDX 中的第 3 个参数,第 4 个 RCX,第 5 个 R8,第 6 个 R9,等等,它们都被传递到堆栈上;浮点参数在 XMM0-7 中传递

    所以,你的 printf 调用应该是:

    mov     rsi, DD
    mov     rdi, DD2
    mov     rax, 0
    call    printf
    

    由于我们没有在 xmm regs 中传递任何内容,我们将 rax 设置为 0(没有它可能会崩溃)

    我还应该注意,堆栈必须是 16 字节对齐的,这是当您的程序启动并链接到 c 库时。但是,由于调用将一个 8 字节的值压入堆栈(返回地址),因此堆栈未对齐。在您的功能开始时(在您的情况下为 main),只需执行 sub rsp, 8 即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 2012-04-05
      • 2011-02-13
      • 2014-12-10
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      相关资源
      最近更新 更多