メモリ - みる会図書館


検索対象: 月刊 C MAGAZINE 1991年1月号
56件見つかりました。

1. 月刊 C MAGAZINE 1991年1月号

lnformation from CompiIer Makers POWER C Ve れ 2.0 」 行われますのて , 標準ライプラリ オプジェクトファイルに と同一のディレクトリに入れてお 出力される けばよいてしよう。 メモリモテル情報 リンク時のメモリモテル コンパイラは , さまざまな制御 情報をオプジェクトファイルに出 チェック 力して , リンカやデバッガの動作 コンパイラは , オプションにし を制御します。 たがってコンパイル時に指定され 今回は , メモリモデルの選択に たメモリモデル情報をオプジェク よってコンパイラやリンカなどが トファイルに出力します。 プログラムファイルに対してどの リンカは , オプジェクトファイ ような処理を行うかを説明してい ルからメモリモデル情報を取得し , きます。 リンクするオプジェクトファイル #pragma を使用した がすべて同一のメモリモデルて、コ ライプラリファイルの ンパイルされているかどうかをチ 指定 ェックします。 もし , 異なるメモリモデルてコ libra オプションはリンク時に ンパイルされたオプジェクトファ 検索するライプラリを指定するた イルが検出された場合には , リン めに使われます。ライプラリ名に はスペシャルキャラクタ「 ? 」 , 「 * 」 力はエラーメッセージを表示し , 処理を中断します。このため , 複 が使用てき , メモリモデルによっ 数のファイルに分割してプログラ て対応するライプラリを指定てき ムを作成する場合に , うつかりミ 0 スて誤ったメモリモデルのオプジ 「 ? 」はスモールメモリモデル , ェクトファイルをリンクしてしま ミディアムメモリモデル , ラージ い , バグの原因となってしまうと メモリモデルの場合に , それぞれ , いったことが避けられます。 「 S 」 , 「 M 」 , 「 L 」に置き換わりま 別の問題となりますが , ライプ す。 ラリファイルがディスクに存在し 「 * 」はスモールメモリモデル , ない場合には , 参照未解決のエラ ラージメモリモデルの場合には , ーとなります。ご注意ください 「 ? 」と同様てすが , ミディアムメ モリモデルの場合には NULL 文字 に置き換わります。 テパッガと この機能を使用すれば , ューザ メモリモテル が作成したライプラリも標準ライ デバッガもリンカと同様にファ プラリと同様に , メモリモデルに イルからメモリモデル情報を取得 関係なくリンカが自動的に選択し し , 自動的に判断します。 ます ( この例として List 1 ~ 2 , およ び Fig. 1 を参照してください ) 。 このため C のレベルてプログラム なお , ューザライプラリの検索 をトレースするかぎりメモリモデ も標準ライプラリと同様の手段て ルを意識する必要はありません。 LlSt 1 1 : / * this file name is trans. c ( library part) 2 : #include く string. h> struct { 3 : typedef 4 : int digit 5 : Char *symbol : 6 : } TRANTBL : 7 : translate( string, value, table ) 9 : Char *string 10 : i nt value 11 : TRANTB し *table : while ( value 〉 : table->digit ) { 13 : strcat( string, table->symbol ) value = value - table->digit return ( value ) 17 : 19 : transvalue( string, value ) 20 : VO i d 21 : Char *string : 22 : int va ー ue : 23 : { TRANTB し tab 厄 [ ] 24 : static 25 : 900 , 26 : 100 , 27 : 40 , 10 , ” X ” 28 : 5 , 4. 29 : 1 : 30 : int count int limit ・ 32 : linit = sizeof( table ) / sizeof( TRANTB し ) 33 : strcpy( string. 34 : for ( count 35 : : count く linit : count 十十 ) { 36 : ニ translate ( stri ng. value, &table[ count ] ) va ー ue 38 : } 0 0 1 ・ 0 0 LlSt 2 1 : / * file iS roman. C 2 : #include く stdio. h> ” tranlib?. nix ” 3 : # pragna library transvalue( char も int ) 4 : extern VOid 5 : main( ) 6 : VOid 8 : value : int string[ 20 ] 9 : Char . 999 ) ・ printf( "lnput value ( 1 scanf( ” % d ” . &value ) 12 : if ( value > : 1 & & value ← 999 ) { 13 : transvalue( string, value ) : printf( ” Roman numeral is XsYn ” , string ) 15 : 17 : else printf( "lnput value is out Of range. ) pc /ms trans mer e tranlibs t 「 ans pc /mm trans mer e tranlibm t 「 ans pc /mlt 「 ans me 「 e tranlibl trans pc /ms/e roman pc /mm/e 「 oman pc /ml/e roman スモールモデル用のライプラリを作成 ミディアムモテル用のライプラリを作成 ラージモテル用のライプラリを作成 スモールモデル実行ファイルを作成 ミディアムモテル実行ファイルを作成 ラージモテル実行ファイルを作成 lnformation 作 om Compiler Makers 169 システム・ワン

2. 月刊 C MAGAZINE 1991年1月号

TabIe 13 memmax 関数 (MS-C5.1 ) と coreleft 関数 (Turbo C 2 0 ) 未使用のメモリ量の取得 nea 「ヒープから取得できる最大メモリプロックの大きさの取得 co 「 ele れ関数 ( Turbo C 2.0 ) memmax 関数 ( MS-C 5.1 ) #include く m 訓 OC. h > #include く alloc. h> Size t memmax(void) , unsigned coreleft(void) . fo 「タイニィ , スモール , ミディアムモテル unsigned long coreleft(void) : f0 「コンバクト , ラージ , ヒュージモテル nea 「ヒープから取得できる最大メモリプロックの大きさ ( バイト数 ) を返す 0 の場合割り当て可能なメモリがないことを示す スモールテータモテルではスタックとテータセグメントの間 ( nea 「ヒープ ) の未 この関数は near ヒープ版の malloc 関数に相当する nmalloc 関数で獲得でき 使用メモリの量から 256 バイト引いた値を返す るサイズを返すがスモールモテルでは m 訓 oc 関数と一 nm 訓 oc 関数は同じであ ラージテータモテルてはヒープとスタックの間 ( fa 「ヒープ ) の未使用メモリの量 るため List3 では m 訓 oc 関数に対して使用している を返す Fig. 1 MS ー C のスモールモテルのメモリ配置 低位アドレス Fig. 2 TurbO C のスモールモテルのメモリ配置 低位アドレス プログラムコード 初期化されているテータ 定 数 初期化されていないテータ スタック領域 near ヒープ 最大 64KB プログラムコード 初期化されているテータ 初期化されていないテータ near ヒープ スタック領域 最大 64 KB 最大 64KB 最大 64KB far ヒープ far ヒープ 高位アドレス 高位アドレス Fig. 3 C 言語によるティスク操作 MS—DOS ティスク 9 MS—DOS ティスク 9 ラ イ ラ の MS—DOS の内部 ティスクバッファ ファイルポインタ用の ティスクバッファ ファイルポインタによる ティスク操作 C 言語のライプラリ アイルハンドルによる ティスク操作 MS—DOS の内部 ティスクバッファ 94 CMAGAZINE 1991 1

3. 月刊 C MAGAZINE 1991年1月号

PragmaC 特別アンケート 氏名 当呂呂呂呂呂 0 呂呂呂呂目呂 0 呂呂 年齢 歳 男・女 TEL 住所 希望商品 Turbo C 十十・ LS ト C ◎ 0 ◇ △ メモリモテル 設問 SmaII(CODE く 64K, DATA<64K) Medium(CODE>64K, DATA<64K) Compact(CODE く 64K, DATA>64K) Large(CODE>64K, DATA>64K) Huge(CODE>64K, DATA>64K) Tiny(CODE 十 DATA く 64K) 1 86 / 286 リアルモード命令 ( enter , leave ・ ") 386 / 486 リアルモード命令 ( 32 ビット ) 286 プロテクトモード ( メモリアクセス ) 386 プロテクトモード ( メモリアクセス ) 386 プロテクトモード ( 工クステンダ ) 工ミュレータ コプロセッサ ANSI X3J11 Kernighan & Ritchie UNIX 4.2BSD/PCC MicrosoftC ANSI X3J1 1 UN Ⅸ ( 低レベル I/O ) DOS(INT 21h サポート ) コンソール ( 工スケープ 0 「ダイレクト ) グラフィックス マウス コミュニケーション旧 S ー 232C ) Windows インタフェイス 漢字処理 インラインアセンプル 割り込み処理 ※ 2 CPU サポート 浮動小数点演算 コンバチピリティ ライプラリ そのほか 備考 174 CMAGAZINE 1991 1

4. 月刊 C MAGAZINE 1991年1月号

を転送します。渟通に書くと , ル時に計算する機能は亜要て、す。これを素 ヒ。ーします。コヒ。ーの後に S に団をデータ while (count— 直に引・算するコードを生成して実行時にア サイズ ( バイトならば 1 , ワードならば 2 ) だ * tO 十十 = * from 十十 : ドレス計算をしていたのて、は遅くてたまり けディレクションフラグに従って増減しま て、すんて、しまうのて、すが , ループを展開し ません。 す。 たこの例て、は実際にループが実行される回 定数計算のコンパイル時実行とコヒ。ーの ストリング命令には CX レジスタの値を繰 数を 8 分の 1 に減らしています。最初の 1 回だ 伝播とを組み合わせると , さらに多くの定 り返しの回数として指定するための REP プ けは count を 8 て、割った端数個のデータを転 数式を検出して効率を E げることが可能に リフィックスをつけることがて、きますから , 送するために switch 文による分岐を利用して なります。 CX 個のデータ転送をわずか 1 命令 REP MOVS います。 たとえば以下の , て、実行て、きるのてす。たとえば , 10 * 4 : Char, *tO, *from : a 定数計算のコン督ル時実行 unsigned count : 次のプログラム , 100 * sizeof(int) ; a のような定数の式を , 実行時て、はなくコン パイル時に計算してしまうのがこの最適化 て、す。実行時の計算を減らすことがて、き れば , オプジェクトコードの速度もサイズ も向 l•. します。 #define て、定義した記号定数や sizeof 式を 使Ⅲするときにはソースプログラム上に定 数式が出現しますが , そのほかにもコンパ イラが内部的に定数式を生成する場合があ ります。それは配列の特定の要素を定数の 添え字て、参照するときて、す。 int array [10] C20] : a 十 3 : b は , for ( : count ! = 0 ; count— * tO 十十 = * from 十十 : というプログラムは , 次のようにコンパイ ルて、きます ( セグメントレジスタは考慮して いません ) 。 MOVSB の最後の B はデータサイ ズがバイトてあることを示しています。 MOV CX, count MOV DI, to MOV SI, f 「 om CLD MOVSB REP この最適化て、はループが 1 命令にコンパイ ルされています。 68000 系 CPU にはまるて℃のために用意さ れているようなアドレシングモードが存在 int a : array [ 5 ] [ 3 ] ; します。プリデクリメントとポストインク a 十十 ; a この式をコンパイルするとき , a [ 5 ] [ 3 ] を実行するのに速い命令が用意されている リメントアドレシングモードがそうて、 , の要素のアドレスを計算するためにコンパ れらはアドレスレジスタが指すメモリの内 ならそれを使うほうがよいわけて、す。多く イラは内部て、は次の式を生成します。 の CPU て、は一般的な加算命令のほかに「 1 を 容を参照するときにアドレスレジスタの値 address Of ar 「 ay 十 ( ( 5 * 20 ) 足す」ための特殊な命令が用意されていま を増減します。 十 3 ) 十 sizeof(int) プリデクリメントて、はメモリを参照する す。 8086 系て、は C 命令がそれてす。 68000 こて、 ( ( 5 * 20 ) 十 3 ) *sizeof(int) は定数式 前にアドレスレジスタの内容からデータサ 系ては ADDQ て、すね ( ADDQ は 1 から 8 まて、の もしも配列 a 「「 ay が外部変 て、す。さらに , 数を加えることがて、きます ) 。 イズ ( 1 , 2 , 4 バイト ) を減じます。逆にポス 数 , あるいは関数内の statio 変数て、あれば また , 8086 系の CPU にはストリング命令 トインクリメントはメモリ参照の後にアド address of array も定数 ( ラベル ) になりま という配列のようにメモリ内に整列したデ レスレジスタにデータサイズを加えます。 す。 ータを扱う特殊命令があります。ストリン これらは互いに相補的な操作て、 , スタック このような配列参照による定数式は意外 グ命令 MOVS は SI レジスタが指しているデ のブッシュ , ポップの動作に相当します。 によく出現しますのて、 , 定数式をコンパイ ータを DI レジスタが指しているメモリにコ このアドレシングモードが 8 本あるアドレ CMAGAZINE 1991 1 116 40 : a 43 : b と変形て、きますね。 特殊命令の使用 これはターゲットとなる CPU に用意され ている特殊命令を使用する最適化て、す。 たとえば , int a ; あるいは ,

5. 月刊 C MAGAZINE 1991年1月号

List OC : expr strlen( "ABC") ; とすれば 3 と表示してくれる。 コマンドモードて、は , このほかにもたくさん の機能が使える。 CodeView などのデバッガのようにウォッチ変 数を設定して , 実行時の変数のようすを見るこ とも可能て、ある。 これらのエデイタを使ったことのある人ならす てはきわめてメジャーなエデイタに似ていて , メニューの構成は ,Mifes,RED といった DOS 上 様にプルダウンメニューを採用しており , その タになっている。 こちらもコマンドモードと同 工ディットモードはいわゆるテキストエディ ドモードに戻る。 に移ることがて、きる。もう 1 度押せば , 再びコマン 干ードてキーを押すと , 工ディットモード 工ディットモードに移る必要がある。コマンド 工ディットするにはもうひとつのモードて、ある ラムの書き換えまて、はて、きない。プログラムを ラムの参照はて、きるが , BASIC のようにプログ コマンドモードて、は , LIST コマンドて、プログ 工ティットモード ifes ライクな て、きる。 ド名を覚えなくても簡単 . に各種操作することが メニューに含まれているのて、 , すべてのコマン てきる。コマンドて、指定てきるものも , すべて り当てられたプルダウンメニューを使って選択 これらの機能は , 各ファンクションキーに割 み込みメニューを開いているところて、ある。文 Fig. 2 はエディットモードてプログラムを読 ぐに慣れるてあろう。 ル 5 1 . 淑 朝 0 はび : ) ーを Gr 物 0r8 「ヨい 0 ツ「は ! : 123 Fig. 1 ORCHID C の起動画面 を見たい場合には , expr コマンドを使い printf( "Yntime %f sec", difftime( done. start)) : 1 : 2 : 3 : 5 : 7 : 8 : 12 : 13 : 14 : 22 : 23 : 24 : 28 : 29 : 30 : 32 : 33 : 34 : 35 : 36 : TabIe 2 buf0 [ 3999 ] = buf0[i] = for ( i = 0 : i く 4000 ; int ー : long start, done; char bufl [ 4000 ] : char buf0 [ 4000 ] : 9 : ma i n ( ) 6 : # end i f #include く string. h> 4 : #ifdef MSC #include く time. h> #include く stdio. h> start = time( &start) : strcpy( bufl, strcpy( bufl, strcpy( bufl, strcpy( bufl, strcpy( bufl, strcpy( bufl, strcpy( bufl, strcpy( bufl, strcpy( bufl, for ( i ー 0 : i く 20 : i + + ) { buf の : buf0) : buf0) : ー buf0) : buf0) : buf の : buf0) : buf0) : buf の : done = time( &done) : コマンドー覧 strcpy( bufl, bufO) : strcpy( bufl, strcpy( bufl, strcpy( bufl, strcpy( bufl, strcpy( bufl, strcpy( bufl, strcpy( bufl, strcpy( bufl, buf0) : buf0) : buf0) : buf0) : buf の : buf0) : buf0) : buf0) : strcpy( bufl, strcpy( bufl, strcpy( bufl, strcpy( bufl, strcpy( bufl, strcpy( bufl, strcpy( bufl, strcpy( bufl, strcpy( bufl, buf0) : buf0) : buf0) : buf0) : buf0) : buf の : buf0) : buf0) : buf0) : コマンド名 blist bDlist cls cd del edit exp 「 files flist help llist load name new quit 「 un save Slow SteD tab t 「 ace type vlist 機能 組み込み関数の一覧を表示 プログラム内で定義された変数の一覧を表示 指定したファイルの内容を表示 プログラムをトレースモードで実行 タブサイズを再設定 ( 1 から 20 ) プログラムをシングルステップモードで実行 プログラムをトレースモードで実行 ( ウェイトつき ) プログラムをディスクに書き込む プログラムを実行 C インタブリタを終了 ロードしたプログラムをメモリ上から消去 ロードしたプログラムのファイル名を変更 プログラムをメモリ上に読み込む メモリ上のプログラムをプリンタに出力 メモリ上のプログラムを表示 コマンドの使用方法を表示 プログラム内で定義された関数の一覧を表示 指定したティレクトリの内容を表示 C の式を計算して結果を表示 プログラムを編集 指定したファイルを削除 指定したティレクトリの内容を表示 カレントティレクトリの変更 画面上の文字を消去 設定されたプレークポイント一覧を表示 140 CMAGAZINE 1991 1

6. 月刊 C MAGAZINE 1991年1月号

のが多いものて、す。 13 ) 。 し マクロ mem a Ⅱ oc の第 1 引数 pt 「は , 確保し のて、マクロにしたくなってきます ta(Fig. リを確保するときもお決まりの処理が続く マクロ mem alloc を定義してみます。メモ て、はこの記法を使ってメモリを確保する 領域確保のマクロ化 去みやすくなると思います。 この記法を前の記法と比較すると格段に わりません。 に Y がついているほかは , 普通の C 言語と変 きます。このように記述すれば行の終わり 直すと Fig. 12 一②のように定義することカイ す。この機能を使い , 上記のマクロを書き 後に Y を置けば次の行に続けることカイきま # define 文て、定義が長くなる場合は行の最 これはなんとかならないのかと考えてみ 1991 1 た領域の先頭ポインタて、す。第 2 引数 type は 126 CMAGAZINE うに定義したとします。このマクロ file open は , ファイルポインタ fp, ファイル名 fname, モード mode を引数としています。 ファイル名が fname のファイルをモード mode て、オープンし , ファイルポインタを fp に代入 します。ファイルオープンに失敗した場合 , メッセージを出力させた後に関数 exit を用い て強制終了させています。 この処理はファイルをオープンするとき には必す行うのて、 , マクロにする価値があ ります。 お勧め , マクロを読みやすくする記法 しかし , Fig. 12 ー①のマクロはとても読み にくいて、すね。プログラムを保守という面 から考えると , 読みやすさも重要なファク ターになってきます。読みやすさが重要て、 あるにも関わらず , 世の中の C 言語の参考書 に瞽かれているマクロの例は読みにくいも 12 : } 19 : } 24 : { #define file_open(fp, fname, mode) if((fp ニ fopen(fname, mode)) = NIJLL) Fig. 12 ファイルオープンのマクロ fp 「 intf(stde 「「 , " % s がオープンてきません。 *n", fname) : exit( 1 ) #define file_open(fp, fname, mode)* exit( 1 ) : \ fp 「 intf(stde 「「 , " メモリーか確保できません。 *n つ : ¥ if((pt 「ニ (type*)malloc(sizeof(type) * ( size ) ) ( #define mem alIoc()t 「 , type, size)* Fig. 13 領域確保のマクロ exit( 1 ) : \ fp 「 intf(stde 「「 , " % s がオープンできません。 *n", fname) , ¥ if((fp ニ fopen(fname, mode)) = NIJLL) { \ ) = NULL) List 9 テキストファイルを連結して標準出力に出力するプログラム int main( int argc, char *argv ロ ) 5 : #define arg_main() 4 : / * 引数付き main 関数定義部のマクロ * / 2 : # i nc I ude く std I i b. h > 1 : # i ncl ud e く std i 0. h> ① 3 : 6 : 9 : 10 : 13 : 15 : 17 : 20 : 21 : 22 : 23 : 25 : 26 : 28 : 29 : 30 : 32 : 33 : 34 : 35 : 36 : 38 : 39 : 40 : 41 : #define mem_alloc( ptr, type, size ) \ 14 : / * メモリに領域確保を行うマクロ * / ex i t ( 1 ) ; \ ” %s がオープンできません。 Yn ” fprintf( stderr, ニ NUL し ) { \ if ( ( fp = fopen( fname, mode ) ) 8 : #define file_open( fp, fname, mode ) \ 7 : / * ファイルオープンを行うマクロ * / fname ) : \ 16 : i f ( ( ptr (type* ) ma Ⅱ oc ( s i 2 eof ( type ) * ( s i z e ) ) ) fprintf( stderr, " メモリーが確保できません。 Yn");Y = NULL ) { \ ex i t ( 1 ) : \ #define MAXBUF 512 arg-main() if ( argc く 2 ) { FILE **fp_ptr; i nt i : char buf[ MAXBUF ] : "Usage ex i t ( 1 ) : fprintf( stderr, mem for -alloc( fp_ptr, FI し E * , argc ー ( i 0 : i く argc fputs( buf, stdout ) : while ( fgets( buf, MAXBUF, fp_ptr[ file-open( fp_ptrC i ] , argv[ i + 1 ] , / * 引数付き main 関数定義部 * / / * ファイルポインタのポインタ宣言 * / / * ファイルオープン / * ファイルポインタ型の領域確保 * / . く ret>Yn ” argv [ 0 ] ) : / * 引数のチェック * / : %s f i 1 e 1 f i 1 e2 . / * 行入力 * / / * 行出力 * /

7. 月刊 C MAGAZINE 1991年1月号

P 「 agmaC 特別アンケート 諸般の事情より休載が続きご迷惑をおか あるいは ェミュレータて、サポートするか , 己入方法 けしておりました『オリジナル C コンパイラ プロセッサ ( 87 / 287 / 387 ) て、サポートするか PragmaC 』も , ようやく連載再開準備が整 住所・氏名などを明記したうえて , 各チ を選択していただきます。 いつつあります。 ェック欄にチェックマークをご記入くださ ←コンヾチビリティについて 連載再開にあたっては , かねて告知いた 。なお , 各記号 ( ◎ ~ x ) は以下の意味を しました PragmaC 制作委員会の結成 , 仕様 コンパチビリティに関しては , 現時点て、 表しています。 を決定するための討論会の開催が不可欠て、 ◎絶対に必要である はライプラリの問題を一時保留していただ はありますが , いまだ実現しておりません。 〇 き , コンパイラそのものとのコンパチビリ 必要と思われる そこて、 , PragmaC 制作委員会結成の準備作 ◇将来的には必要と思われる ティについてのみお考えください 業の一環として , 読者の皆様に簡単なアン また , 「 Kernighan & Ritche 」という設 △どちらでもよい ケートのご協力をお願いいたしたいと存じ 問は , パラメータリストによる関数宣言な x 必要ない 上記の各マークを参考に任意の欄にチェ ます。 どのオールドファッションに対応するべき このアンケートは PragmaC 制作委員会に ックマークを書き込んて、ください。なお , か否かについての質問とご理解ください おける討議の内容 , オリジナル C コンパイ 設間「 MicrosoftC 」については , コンパ ◎は各項目につきひとつのみチェックして ラ PragmaC の基本仕様決定の参考にさせ ください ( 注 : 「メモリモデル」の項目て、あれ イラて、使用されている定数・変数などにつ ていただくとともに ,PragmaC 制作委員会 ば , 6 つの設問のうち , ◎の欄にチェックて、 いても考慮したうえて、ご判断ください 委員選考の資料とさせていただく予定て、お きるのはひとつのみとなります ) 。◎以外の ←ライプラリについて ります。 チェック欄には複数記入していただいても なにとぞご協力のほど , お願い申し上げ ライプラリについて現時点て、は , 個々の 結構て、す。 具体的な内容にとらわれる必要はありませ ます。 返送方法 ん。大雑把にとらえてご考慮ください。個々 アンケート項目の概要 のライプラリについては , 後日 , 改めてア アンケートにご回答いただいたのち , ア 次のページのアンケート用紙は , 以下の ンケート形式て、 , 皆様のご意見をお伺いす ンケート用紙 ( 173 , 174 頁 ) を切り取り ( コヒ。 項目についてのチェックリストになってい る予定て、おります。 ーても可 ) , 下記アンケート係まて封書にて ます。 返送ください。返送いただいた皆様のなか ・一そのほか から , 抽選により Turbo C 十十 Ver. 1.0 ( 1 ←メモリモテルについて インラインアセンプルは , QuickC Ver. 名 ),LSIC-86 Ver. 3.1 ( 1 名 ) をモニタブレ 2.0 , MicrosoftCVer. 6.0 コンパチプルの PragmaC がサポートすべきメモリモデル ゼントいたします。なお , モニタブレゼン ( セグメンテーション ) を選択してください asm 文としてお考えください トの当選者には , モニタレポートを提出し Huge モデルは , 32 ビットのアドレス計算 割り込み処理については , 割り込みルー ていただぎます。モニタレポートに関する チンとしての enter , leave を行う関数をサポ が必要かどうかて、す。 詳細は当選者に後日ご連絡いたします。ま Tiny モデルは , . com ファイルの生成が必 ートするかどうかについてお訊ねしており た , モニタブレゼント当選者は本誌 172 頁の ます。 要かどうかて、す。 モニタ募集には当選てきません。 また , ※ 1 および※ 2 には , 質間項以外 ← CPU サポートについて アンケート受け付け締切 て、 , 皆様が ( 基本仕様として ) 必要と思われ る項を書き込んて、いただければ芒いて、す。 PragmaC がサポートすべき CPU, そのレ 平成 3 年 1 月 10 日必着 ベルについて一考ください ←備考欄について 宛先 プロテクトモードのメモリアクセス , お よび工クステンダに関しては , 対応すべき 基本仕様に対するご要望はもとより , そ 〒 108 かどうかのみを考慮してください れ以外のご要望 , ご意見 , またはこれまて 東京都港区高輪 2 ー 19 ー 13 NS 高輪ビル に掲載された PragmaC の記事に対する質問 ソフトバンク株出版事業部 ・浮動小数点演算について などがございましたら , てきるだけ具体的 C マガジン編集部「 PragmaC 」係 この項目の意味は , float / d 。 uble の演算を にご記入ください PragmaC 特別アンケート 173

8. 月刊 C MAGAZINE 1991年1月号

に一彡売 GN び奮闘記ー第⑩回吉野智興 XC V 部 .2.0 での G ソフトコンヾレ 己述されています。 憶にありません ( これは絶賛に値すると思う 先日 SHARP から XC Ve 「 . 2.0 か発売にな のて、すがいかがて、しよう ? ) 。 りました。今回は XC Ver. 2.0 で GNU ソフ 5176 行 143269bYte 今回の評価て、は , ライプラリ自体のバグ decl. c トウェアをコンバイルして , その性能を探 78997byte ( 存在していないことを願うのみて、すが ) の 1834 行 trans. h ってみようと思います。また今までに報告 564 行 32194bYte p2c. hdr 混入を避けるために , 従来の XC Ver. 1.01 あるいは発見されている GCC のバグにつ 422 行 20271bYte のライプラリて、今まて、私が知り得たバグを p2c. pro てもレポートします。 フィックスしたものを使うことにします。 C コンヾイラについて 274731bYte 7996 行 また , オリジナル XC Ver. 1.0 に存在しな の偏見 いライプラリ関数は前田氏の h68UNIX ライ これに stdio. h と stdlib. h, string. h をインク プラリを使用します。 C コンパイラの性能を判断する場合 , どう ルードします。ヘッダファイルは XC Ver. してもその出力コードの最適化に目を奪わ 巨ソースのコンヾイル 2.0 のものをそのまま使ってコンパイルしま れがちて、す。しかし , 実際にプログラムを 作ったり , 移植したりする場合には最適化 結果は一部の記述がエラーになり , 修正 ます , 最初に GNU ソフトウェアによくあ より , 安定した動作 ( 正しいコンパイル結果 ) が必要て、したが ( これに関しては後述します ) る 100K バイトを楽に越える巨大なソースを のほうが現実的て、重要だと思われます。 コンパイルて、きました。ただし , 相当巨大 正常にコンパイルて、きるかを試してみます。 自分の作ったプログラムをデバッグする なテンボラリファイルを生成するらしく , X68000 て、はメモリ空間がリニアて、すから , 場合 , 「コンパイラとライプラリは正しい動 環境変数 TEMP に設定されていた RAMDIS ほとんどのソフトウェアての作業バッファ 作をしている」ことを仮定して行うのが普通 K が溢れてしまいました ( 約 720K バイトフリ などは実メモリ量て、決定される場合がほと て、すが , 実際にはコンパイラ自体が正しく ーエリアを確保してあったのてすが ) 。計測 んどて、す。テスト環境としては約 3.5M バイ ないコードを出力している場合やライプラ 条件と結果を Fig. 1 に示しておきます。 トフリーて、行いました。 リのバグて、あることがままあります。 XC Ver. GCC に比べて異常に時間がかかっていま サンプルとしては GNU p2c(Pascal to C 1.0 て、はライプラリとコンパイラ双方にバグ すが , おそらくこの巨大なテンボラリファ translator ) の宣言処理部分 decl. c を使いまし が存在し , その情報は各種 BBS などて、流れ イルの入出力が相当時間を消費していると た。このプログラムは GNU の中ては珍し ています。 田われます。時間をかけても出てくるコー く , ANSI 準拠の処理系て処理てきるように メーカーからコンパイラやライプラリの ドは GCC と比較すると悲しくなるくらいム 記述されたプログラムて , 構造体を関数ハ バグ情報が雑誌などに報告されている例は ダが多いコードてす。というより GCC がか ラメータとして渡すなど , 新しい形式の C て、 稀て , 本誌の LSI ー C のバグ報告くらいしか記 ける時間のわりには素晴らしい最適化を行 Fig. 1 ソースからアセンプルファイルを生成するまでの時間の計測 うといったほうがよいのてしようか ? 14 : 56 ( 896sec) XC Ve 「 . 2.00 no Optimize bison Ver. 1.0.11 の 4 : 40 ( 280sec) GCC Ve 「 . 1 .37.1 no ODtimize コンヾイル 17 : 30 ( 1050SeC ) XC Ve 「 . 2.00 Optimize 6 : 31 ( 391sec) GCC Ve 「 . 1 .37.1 Optimize 比較的手ごろなサンプルとして , GNU 計測条件 X68000 初代機種 HDD 江 X680 。メモリ 6M バイト。 temp は RAM DlSK0 RAM bison を XCVer. 2.00 てコンパイルして実行 DISK D 日Ⅳ E 日はフリーウェア g 「 ad. x 。 なお , メモリボードは純正。ただし , アドレス $ 20000 以降にアクセスした場合はウ工 ファイルを生成してみました。この bison は イトが入りますが , それはジャンバを変更してノーウェイトにしてあります。 ソースはすべて日 AMD 旧 K におき , プログラムは HDD から起動します。 yacc にあたるコンパイラコンパイラ <,GCC 二二ロ 、 0 Conference Room 149

9. 月刊 C MAGAZINE 1991年1月号

に一彡売 読者投稿プログラ乙坪根治廣・野瀬佳正 ( 舞鶴 , 業高等専門学校 ) フレームメモリを用いた 人工衛星テータの自然色画像表示 とがて、きる。プログラミング言語はマイク に設定し , 3 バンドを混ぜ合わせて合成カラ はじめに ロソフト社の QuickCVer. 2.0 を使用してい ー画像表示するものて , TM のバンド 3 → る。また使用するデータは ( 財 ) リモートセ 赤 , バンド 2 →緑 , バンド 1 →青とすると自 パソコンに画像処理用のポードを差し込 ンシング技術センターが配布している IBM 然色て、表示される。このとき , しきい値の フォーマットのデータて、 , 誰て、も手軽に入 取り方が重要て、ある。 み画像をフルカラー表示するフレームメモ リの進歩は著しく , 近年高性能のものが数 手することがて、きる。 リモートセンシング技術センターから配 布されている人工衛星データにはランドサ 種類発売されている。高性能のフレームメ 工衛星のデータについて モリの出現によって , パソコンを使って素 ットの MSS, TM, 国産の MOS-I の MESSR 人て、も鮮明な画像を得ることがて、きるよう があり , 衛星データのフロッビーディスク 人工衛星データには医用画像データなど は IBM フォーマット , すなわち領域の絶対 になり , 研究 , 教育の面て、成果をあげてい にはみられない特長がある。それは可視域 位置 ( シリンダ , サフェイス , セクタ ) を指 のデータが 2 ~ 3 バンドに分かれていること 本稿て、はパソコンにフレームメモリを装 定して書き込まれているのて , それを読み 着し , 人工衛星データの 3 つのバンドそれぞ ある。たとえば TM のデータては , バンド 1 出す関数が必要て、ある。 れに色の三原色てある R ( 赤 ) , G ( 緑 ) , B ( 青 ) は可視域の青の波長帯 , バンド 2 は可視域の QuickC r. 2.0 について の色を割り当て , 各バンドのレベル値を代 緑の波長帯 , バンド 3 は可視域の赤の波長帯 入して R , G, B を任意の濃淡に設定し , そ て、ある。したがって , この 3 つのバンドデー タを組み合わせると , 人間が目て見ている QuickC Ver. 2.0 には BIOS 関数ライプラ れらを混ぜ合わせて 1677 万色の合成カラー のと同一の自然色の画像を得ることがて、き リという便利な関数ライプラリがあり , 画像を表示するプログラム (fcompo. c, 付録 の中に bios disk( ) という関数がある。この る。実際には , 色の三原色て、ある赤 , 緑 , ディスク収載 , Fig. 1 参照 ) を紹介する。 bios disk 関数を使用すると , IBM フォーマ のプログラムによって , 自然色画像 , 擬似 青のそれぞれの色に各バンドのデータを割 ットの衛星データからシリンダ , サフェイ り当て , 各色を任意の濃淡 256 ( 0 ~ 255 ) 階調 自然色画像 , 赤外カラー画像を表示するこ ス , セクタを指定してデータ ( 256 バイト ) を 引 OS. C メモリ内に読み込むことがてきる (List 1 参 照 ) 。 レームメモリの概要 こて、使用するスーパーフレーム 22 はサ ヒ。工ンス社のフルカラーフレームメモリて , PC ー 9801Vm21 以上の機種に使用てき , 640X400 ヒ。クセル , ピクセルあたり 1677 万 色表示させることがてきる。このスーパー フレーム 22 は独自のグラフィック画面をも っていて , MS ー DOS 上の C 言語て使用するこ とがてきるようにグラフィックライプラリ LiSt 1 : / * BIOS 関数 : _bios_disk * / 2 : / * ファイル名 BIOS. C 3 : 4 : #include く bios. h> 5 : unsigned char far diskbufC270], 6 : resuItC16]; 8 : struct diskinfo_t di : -bios-disk 関数 12 : _CMD_SEEK ー _CMD_MF ー _CMD_MT ー _CMD_RETRY di . command CMD_2HD; di . drive drv ; 14 : di . head suf; 15 : di. cylinder cyl ; , , 76 ー 16 : di. sector , , 26 - sec : 17 : di. data_len 256 ; ー IBM:256 MS ー DOS : 1024 ーー * / di. sect()l ・ _len ー 1 : 256 2 : 512 3 : 1024 ー 19 : di . buffer diskbuf; 20 : di. result result; Conference Room 143

10. 月刊 C MAGAZINE 1991年1月号

株式社ア勤コト バーソナルソフトウェア営業部 アス 統合型表計算ソフト「アシストカルク」、 U N I X の領域へ。 IJN Ⅸ対応版統合型表計算ソフト あのアシストカルクの IJN Ⅸ対応版、ニューリリース。 ・ MS ー DOS 版アシストカルクとの互換性 / MS ー DOS 版と同じ操作性を 実現。 PC ユーザも抵抗なく使用できます。またマクロファイルを使用して データ転送も可能。 MS ー DOS 版とのデータ互換を保てます。・メモリの 制限なし / メモリの制限を受けないので、本来のアシストカルクの機能を フルに使用できます・『アシストカルク十データベースコネクション』では、 メニュー選択方式、または SQL 文の入力により、外部データベース ( ORACLE 、 Sybase ) からデータを検索し、ワークシートデータとして展開 できます。・マウスの使用が可能・デバッガの使用でエラーを素早く処理 SIJN シリーズ対応 ( 新発売 ) ・ NEWS シリーズ対応 ( 12 月発売予定 ) UNIX 、 MS-DOS 、 SUN 、 NEWS 、 ORACLE 、 Sybase は、それそれ、米国 AT & T 社、米国マイクロソフト社、米国 サンマイクロシステムズ社、ソニー株式会社、米国 O 日 ACLE 社、米国 Sybase 社の商標または登録商標です く資料請求番号 004 > 87 , 300 円 ( 税込価格 89 , 919 円 ) アシストカ丿レク十テータベースコネクション 137 , 300 円 ( 税込価格 141 , 419 円 ) ※シリーズ対応のみ ※お問い合わせ先 : 株アシストテクニカルサポートセンター TE し .044 ー 951 ー 5678 FAX. 044 ー 951 ー 5679 株ソフトウェアジャパン TEL. 03 ー 479 ー 8760