next up previous contents
Next: 1.13 GNU Emacs の利用 Up: 1. コンパイル、実行の仕方 Previous: 1.11 -E

1.12 -S

gcc -S とすると、 アセンブリー言語のソース・プログラム (拡張子は .s) が出力される。 これを読むと、どういう機械語命令に変換されているのかが分かる。 場合によっては自分で書き換えて最適化することもできる。

サンプル・プログラム wa.c

/*
 * wa.c
 */

#include <stdio.h>

int main()
{
    double a, b, c;
    printf("two numbers:");
    scanf("%lf%lf", &a, &b);
    c = a + b;
    printf("sum=%g\n", c);
    return 0;
}
サンプル・プログラム wa.s

        .file   "wa.c"
gcc2_compiled.:
.section        ".rodata"
        .align 8
.LLC0:
        .asciz  "two numbers:"
        .align 8
.LLC1:
        .asciz  "%lf%lf"
        .align 8
.LLC2:
        .asciz  "sum=%g\n"
.section        ".text"
        .align 4
        .global main
        .type    main,#function
        .proc   04
main:
        !#PROLOGUE# 0
        save    %sp, -128, %sp
        !#PROLOGUE# 1
        sethi   %hi(.LLC0), %o0
        call    printf, 0
        or      %o0, %lo(.LLC0), %o0
        sethi   %hi(.LLC1), %o0
        or      %o0, %lo(.LLC1), %o0
        add     %fp, -24, %o1
        call    scanf, 0
        add     %fp, -32, %o2
        ldd     [%fp-24], %f4
        ldd     [%fp-32], %f2
        faddd   %f4, %f2, %f4
        sethi   %hi(.LLC2), %o0
        or      %o0, %lo(.LLC2), %o0
        std     %f4, [%fp-16]
        ldd     [%fp-16], %o4
        mov     %o4, %o1
        call    printf, 0
        mov     %o5, %o2
        ret
        restore %g0, 0, %o0
.LLfe1:
        .size    main,.LLfe1-main
        .ident  "GCC: (GNU) 2.95.2 19991024 (release)"

wa.s のアセンブル&リンクにも gcc が使える
oyabun% gcc -o wa wa.s
oyabun% ls wa
wa*
oyabun% ./wa
(以下普通に実行できる -- 省略)


next up previous contents
Next: 1.13 GNU Emacs の利用 Up: 1. コンパイル、実行の仕方 Previous: 1.11 -E
Masashi Katsurada
平成18年4月28日