![]() |
サンプル プログラムのコンパイル例 |
付属のサンプル プログラム 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
自然でわかりやすく、効率のよいコードが生成されています。