3

虽然我知道最好使用编译器内在函数,并且就此而言,printf_chk以及将数据放在.rodata部分中,但我正在寻求更深入地了解汇编语言并对紧凑代码感兴趣。有一点printf我不明白。我知道将参数放在哪里,并且我知道如何使用%al可变参数,但它似乎需要额外的堆栈空间,我无法解释。

这个小程序

        .text
        .globl  main
main:
        movsd   value(%rip), %xmm0    # value to print
        movl    $format, %edi         # format string
        movl    $1, %eax              # one floating-point arg
        call    printf
        movl    $0, %eax              # return 0 from main
        ret
        .align 8
value:  .double 74.321 
format: .asciz "%g\n"

给出一个段错误。

但是,当我向框架添加额外的堆栈空间时,它可以正常工作:

        .text
        .globl  main
main:
        subq    $8, %rsp              # ADD SOME STACK SPACE TO FRAME (WHY?)
        movsd   value(%rip), %xmm0    # value to print
        movl    $format, %edi         # format string
        movl    $1, %eax              # one floating-point arg
        call    printf
        movl    $0, %eax              # return 0 from main
        addq    $8, %rsp              # REMOVE ADDED STACK SPACE
        ret
        .align 8
value:  .double 74.321 
format: .asciz "%g\n"

会不会是对齐问题?value(当和format在一个部分时,我遇到了同样的问题.rodata。)

4

1 回答 1

4

根据 www.x86-64.org/documentation/abi.pdf 和 Microsoft 的http://msdn.microsoft.com/en-us/library/ms235286(v=vs. 80).aspx

于 2012-04-25T22:42:31.347 回答