サンプル プログラムのコンパイル例 |
付属のサンプル プログラム prime.c をコンパイルした結果を例として示します。prime.c は、最初の 100 個の素数を表示するプログラムです。
prime.c のソースコード
1: #include <stdio.h> 2: #define NUM 100 // 探す素数の数 3: int main() 4: { 5: int found = 0; // 発見した数 6: int trg = 2; // 調査対象の数値 7: while ( found < NUM ) // NUM 個の素数を発見するまで続ける 8: { int dvsr = 2; 9: while ( 1 ) 10: { if ( dvsr >= trg ) // 発見 11: { printf( "%d ", trg ); 12: found++; 13: break; 14: } 15: if ( trg % dvsr == 0 ) // 割り切れたら素数ではない 16: break; 17: dvsr++; 18: } 19: trg++; // 調査対象を進める 20: } 21: printf( "\n" ); 22: return( 0 ); 23: }コンパイル結果
上のプログラムを最適化付きでコンパイルすると、次のアセンブラ コードが生成されます (主要部分のみ)。
public _main _main proc near ; line 3 push bp mov bp,sp add sp,-2 push si ; trg push di ; dvsr found$ equ [bp-2] ; size=2 mov word ptr [found$],0h ; line 5 mov si,2h ; line 6 jmp ent_1 ; line 7 top_1: mov di,2h ; line 8 jmp ent_2 ; line 9 top_2: mov ax,si ; line 15 cwd idiv di cmp dx,0h je bot_2 inc di ; line 17 ent_2: cmp di,si ; line 10 jl top_2 push si ; line 11 mov ax,offset a1? push ax call near ptr _printf add sp,4 inc word ptr [found$] ; line 12 bot_2: inc si ; line 19 ent_1: cmp word ptr [found$],64h ; line 7 jl top_1 mov ax,offset a2? ; line 21 push ax call near ptr _printf add sp,2 xor ax,ax ; line 22 pop di pop si mov sp,bp pop bp ret _main endp自然でわかりやすく、効率のよいコードが生成されています。