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 (以下普通に実行できる -- 省略) |