14

私はしばらくの間、C でステートメントを書き、"gcc -S" でコンパイルし、出力を調べることで、GNU アセンブリを独学で学んできました。これは、x86 (および -m32 でコンパイル) では問題なく動作しますが、私の AMD64 ボックスでは、次のコードの場合 (例として):

int main()
{
    return 0;
}

GCCは私に与えます:

.file "test.c"
 。文章
.globl メイン
 .type メイン、@関数
主要:
.LFB2:
 pushq %rbp
.LCFI0:
 movq %rsp, %rbp
.LCFI1:
 移動 $0, %eax
 離れる
 戻る
.LFE2:
 .サイズメイン、.-メイン
 .section .eh_frame,"a",@progbits
.Lframe1:
 .long .LECIE1-.LSCIE1
.LSCIE1:
 .long 0x0
 .byte 0x1
 .string "zR"
 .uleb128 0x1
 .sleb128 -8
 .byte 0x10
 .uleb128 0x1
 .byte 0x3
 .byte 0xc
 .uleb128 0x7
 .uleb128 0x8
 .byte 0x90
 .uleb128 0x1
 .align 8
.LECIE1:
.LSFDE1:
 .long .LEFDE1-.LASFDE1
.LASFDE1:
 .long .LASFDE1-.Lframe1
 .long .LFB2
 .long .LFE2-.LFB2
 .uleb128 0x0
 .byte 0x4
 .long .LCFI0-.LFB2
 .byte 0xe
 .uleb128 0x10
 .byte 0x86
 .uleb128 0x2
 .byte 0x4
 .long .LCFI1-.LCFI0
 .byte 0xd
 .uleb128 0x6
 .align 8
.LEFDE1:
 .ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
 .section .note.GNU-stack,"",@progbits

と比べて:

.file "test.c"
 。文章
.globl メイン
 .type メイン、@関数
主要:
 リール 4(%esp)、%ecx
 andl $-16, %esp
 pushl -4(%ecx)
 pushl %ebp
 movl %esp, %ebp
 pushl %ecx
 移動 $0, %eax
 popl %ecx
 popl %ebp
 leal -4(%ecx), %esp
 戻る
 .サイズメイン、.-メイン
 .ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
 .section .note.GNU-stack,"",@progbits

x86 で。

綿毛なしでx86_64出力アセンブリでGCC -Sを作成する方法はありますか?

4

3 に答える 3

5

学習したいコードを関数に配置してみることができます。

例えば:

int ftest(void)
{
    return 0;
}

int main(void)
{
    return ftest();
}

テスト用のアセンブリソースを見ると、必要なだけクリーンになっています。

..snip..
test:
.LFB2:
        pushq   %rbp
.LCFI0:
        movq    %rsp, %rbp
.LCFI1:
        movl    $0, %eax
        leave
        ret
..snip..
于 2009-09-26T16:15:42.577 に答える
5

セクションに入るもの.eh_frameはアンワインド記述子であり、スタックをアンワインドする必要があるだけです (たとえば、GDB を使用)。アセンブリを学習している間は、単純に無視できます。必要な「クリーンアップ」を行う方法は次のとおりです。

gcc -S -o - test.c | sed -e '/^\.L/d' -e '/\.eh_frame/Q'
        .file   "test.c"
        .text
.globl main
        .type   main,@function
main:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    $0, %eax
        leave
        ret
        .size   main,.Lfe1-main
于 2009-09-27T21:10:12.767 に答える
4

フラグを使用すると、-Os物事がより明確になることがわかりました。私はあなたの小さな例を試しましたが、ほとんど違いはありませんでした。

そうは言っても、(Sparcで)アセンブリを学んでいたときに役に立ったことを覚えています。

于 2009-09-26T17:00:15.043 に答える