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によると、スタックは16バイトに揃えられている必要があります。 80).aspx

于 2012-04-25T22:42:31.347 に答える