コード - みる会図書館


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

1. 月刊 C MAGAZINE 1991年10月号

を Of ev ①、① i 羆 e 第 i 雲 トを , 期待することはて、きません。たとえ ば , MOV BX , 100 なのか , MOV BX,OFF SETaddr なのか決めかねる , といった曖昧 な行が幾つもあるのてす。 逆アセンプラを使うときは , かなり時間 をかけて , 次のような作業をすることを , 私はお勧めします。 ったら , そこはたぶん , コード部て、はなく 果が , 次のようなナンセンスなコードにな いようにしてください。逆アセンプルの結 ンプルされたり , あるいはその逆が起きな にして , データ部がコード部として逆アセ まず , コード部とデータ部の区別を完全 スしているコードを見れば , その使われ方 が分かります。 MOV MOV MOV 日 ET BX, BX, AX, OFFSET data [BX] CBX] data DW 123 い , 重要て、す。煩わしいプロンプトを消す リングの一つの独立した分野といえるぐら グと呼ばれる作業は , リバースエンジニア パッチあてとか , バイナリエディティン を私は知っています。 のに , 実は Y を使っていた , というメーカー 使っている , とマニュアルには書いてある の状況を見ます。 X という通信プロトコルを も何て、も ) の間に , そいつをつないて、 , 通信 その外部装置 ( LAN て、もロポット制御装置て、 タモニタを使います。あなたのマシンと , というときはデー フトウェアが動かない シリアルデバイスを外付けした場合にソ その他の難関 ルすることがて、きます。 を発見したり , その部分だけを逆アセンプ ドライバをトレースしてみて , 間題の部分 という作業は不必要て、す。デバッガて、その こういう場合には , 完全な逆アセンプル アは , 台湾製が多い〕。 〔訳注 : IBM PC 関連のクローンハードウェ て、しようか ? 構て、すが , あなたの片言の中国語が通じる トて、は動きません。台北に電話するのも結 ーカーが提供しているドライバ以外のソフ 買ったばかりの汎用ビデオカードが , メ ノフトウェア自体 マニ三アル = その 究極のリファレンス これはぜったいに OFFSET だ ために , 条件分岐命令を二つの NOP て、置き 換えるとか , プログラムの最後へ飛ぶ分岐 命令を書いて , それ以降に新たな機能を追 加する , といったことがよく行われます。 Je process_y 'X' ; ューザ入力の処理 cmp al, exit program Je jmp IOOP 上のようなコードを , 次のように書き換え たりします。 : プログラムの最後へ行く program end process_y てデータ部て、す : MOV CX, 123 MOV CH, 0 XOR CX, CX 怛 Jmp nop Jmp return : nop こにリター ンする ; CH 窈直を変えている ; また変えている ; またまた変えている 第二に , セグメントレジスタに対する操 作や演算をすべて調べて , 以降のデータの アドレシングがすべて正しいことを確認し ; 穴埋め用 IOOP program end : 次のように書きます。 そうして , プログラムの最後のところには , てください MOV MOV MOV MOV 第三に BX, ES, ES : ES : 40 BX T05 , 123 T05 十 2 , CS ワードオペランド〔 2 バイトオペ ランド〕をすべて調べて , それが定数なの 44 C MAGAZINE 1 1 10 この場合も , そのデータラベルにアクセ していないか , 確認してください それらが定数または他の相対アドレスを指 第四に , データラベルをすべて調べて , しているから〕 〔訳注 : BX によるメモリ参照を MOV BX, [BX] これはぜったいに OFFSET だ MOV BX, 123 を見ると分かります。 それは , 以降のコードて、の値の使われ方 のか , 等々を確認してください か , OFFSET なのか , セグメント (SEG) な cmp cmp Je Jne Jmp al, return : 新しい機能を追加 al, exit program ; 上て、消した部分のコード return ; 新しい機能の処理部分 Robert S. Swanke 氏は , コネチカット州ニ ューイントンの RJ Swantek c. の社長。 友人が則に言し 「リバースエンジニアリングは , しよっ ちゅうやるもんじゃないけど , て、も , それしか手がないときがあるよね」。 さよう , それは , 切羽詰まったときの手 段て、しよう。

2. 月刊 C MAGAZINE 1991年10月号

を使い始めました。 CAI)i•ザインにパワー が必要だったからて、す。しかし Macintosh も 併用していました。そして , ワークステー ションのユーザインタフェイスの貧弱さに は大いに不満を覚えたものて、す。スタンフ ォード大学て、は , オプジェクト指向プログ ラミングを使い , ワークステーションクラ スのマシンにもっとよいインタフェイスツ ールキットをもたらすことを目指した , あ る研究グループに参加しました。この研究 には , 深くかかわればかかわるほど , 強く 惹かれました。 オプジェクト指向プログラミングは , グ ラフィカルユーザインタフェイスにはとに かくうってつけて、す。ューザにしてみれば , 画面上に見えるアイコンそのほかは , それ ぞれ独立した存在て、しよう ? これはいい 換えればオプジェクトに相当します。つま り , ユーザの目に映る形をそのまま反映し たプログラミング作法なわけて、す。 26 C MAGAZINE 1991 10 れから , フォントシステムや , 内部アプリ インタフェイスを操作する箇所て、すね。そ イダーなどのコントロール部分 , ューザが 発することて、す。おおむね , ボ、タンやスラ 工デイタのために実際のオプジェクトを開 私たちのグループが担当したのは , この -Marie 日 ulot というフランス人が書きまし のエデイタなんて、すが , これはおもに Jean とオプジェクトやアプリケーションキット Hagerty lnterface Builder は , 簡単にいう わったのはどのあたりですか ? りますが , Hagerty さんがいちばん深くかか NeXTstep 環境にはいくつかレイヤがあ ケーションアーキテクチャにもいろいろと 関与しました。 NeXT マシンには , アプリ ケーション同士がお互いを利用し合ってタ とても豊富な スクを仕上げられるように アプリケーション間通信機能が用意されて いますが , その中の機能共有の部分も手掛 けました。また , コアアーキテクチャ全般 の開発にも深く関与しました。イベント処 理 , ドローイングといった領域て、す。 ローレベ丿レツー丿レ セットの統合化 NeXTstep はほかのグラフィカルユーサ インタフェイスよりも成熟しているとおっ しゃいましたが , どんなところが違うので しようか ? Hagerty ときどき , スペックを見ただけて、 物知り顔に評価を下す人がいますけれど , どうにも信用し難いて、すね。比較がてきる ぐらい十分に慣れ親しむには本格的なア プリケーションを実際に書いてみる必要が あると思います。 確かに , プログラマの観点 , つまりアプ リケーションを走らせるために何をしなけ ればならないかという点から見れば , 現在 のほとんどのシステムは非常に似通ってい るといっていいて、しよう。 NeXTstep が一歩先んじているところは , その際にローレベルのツールセットが使え る点て、す。 Macintosh ツールポックス , X ツ ールキット , SunView が提供するツールセ ットと似ていますが , これらの機能セット は簡単にはアクセスて、きせん。ちょうど , 機能がぎっしり書かれた本を持っているよ うなものて、す。あるときにあることを行い たいとして , 一体何を呼び出せばいいのか 見つけ出すには , いちいちページをめくっ て調べなくてはなりません。それぞれの機 能は孤立していて , 互いに何の関連性もあ りません。 いや , Mac などて、は多少の関連はあるか な・・・・・・。機能グループを作っているときに そのサプグループを作ったり , もっと上位 レベルのグループを作ったりという程度の つながりはありますね。 しかし , 土台となる統合されたアーキテ クチャが欠けています。オプジェクト指向 プログラミングの手法を取らなければ , 処 理が複雑かっ多すぎて , しよせん手に負え ないのて、す。 一方 , NeXT システムては , キーボ、一ド やマウスやそのほかの入力デバイスから入 ったイベントが , 実に自然にアプリケーシ ョンへ流れ込み , 正しいオプジェクトまて、 到達します。仲介の必要はありません。何 もしなくて大丈夫。次のイベントを受ける 機能を呼び出し , 受けたイベントを別のと ころへディスパッチする機能をさらに呼び 出す , といった手間は無用て、す。 オプジェクトを作っておくだけて、 , ュー ザがボタンやキーポードやマウスそのほか ーに触れたときに , 適当な機能が呼び出され ます。とても統合化された環境なのて、 , 開 発者は自分が作ったオプジェクトの動作だ けに集中て、きます。 これに比べ , Macintosh を使ラ場合には , パネルの中身を作り , 正しい位置にレイア ウトし , マウスがどのボタンをクリックし たかを見張って , しかるべき反応を起こさ せる , というコードがまるまる必要て、す。 NeXTstep て、は , そんなコードは存在しま せん。いったんオプジェクトをまとめてお けば , あとは lnterface Builder が , すべて のオプジェクトにメッセージを送り , 「ディ スクに自分を書き出して」と命令します。そ してオプジェクトをメモリに読み直して , 「さあ起きなさい。出番だよ」と促すのて、す。 そこが根本的な違いて、しよう。じゃあど んなメリットがあるのかというと , ます , 余分なコードを書く必要がなく , 早く完成 します。また , 実際に書いたコードはアプ リケーションの動作指示だけて、すから , コ ードのメンテナンスや理解が容易て、す。さ らに , 機能拡張やコードの改良がある程度 楽になると思います。 というのも , アプリケーションが最初に て、きあがった段階て、は , 必ずしも希望どお

3. 月刊 C MAGAZINE 1991年10月号

前記て , 「初期化と代入のセマンティクス が異なる」というのは , 要するに演算子 = が 妙な風にオーバロードされていて , 「ふつう の常識的な代入文による初期化」を記述てき ない場合 , という意味て、しよう。 こういう細かい , 特殊なシンタスクやセ マンティクスが , C 十十にはあと幾つぐらい あるのて、しよう。しかし , ARM の演算子 の項が , もっとしつかり充実して書かれて ていれば , 日本人の恥をさらすような Air M ail を EckeI 氏に出さずとも済んだのてすがね テフォルト引数の 頑固 C 十 + には , 「関数のデフォルト引数」とい う C にはない便利な機構があります。 point(inta = 3,intb = 4 ) ; 上記て、は , 関数 point( ) を無引数てコールす ると 3 と 4 が引数として使われます。 関数 point ( ) を 1 引数てコールすると , そ の引数は a として使われ , b の値としてはデ フォルトの 4 が使われます。 言い換えると上記のような場合 , 1 引数と して二つ目の引数 ( b ) の値を渡す , というコ ールは不可能てす。これが , C 十十の「関数 のデフォルト引数」という機構の制約の一つ てす。 デフォルト引数を宣言したら , その関数 のそれ以降の引数にもすべて , デフォルト の値を宣言しなければなりません。だから , point( int a = 3 , int b ) ; 上記のような宣言はエラーてす。逆に point(inta,intb = 4 ) : これなら合法てす。 これもまた , 関数のデフォルト引数に関 する制約の一つてす。結局 C の関数コール は , 引数並びの末尾からスタックに積むか ら , デフォルト引数も「末尾から・・・・・」とい う揃いになっていないと , コンパイラとし て対応不能になってしまうのて、しよう。 この他 , デフォルト引数に関しては , い ろいろ面倒なことが ARM の 141 頁以降に書 かれています。ても , 便利なのて、 , ときど き使いたくなります。 class xyz{ FILE* fp ; 上記は , xyz というクラスのメンバ関数 r fd ( ) が , FILE * 型の引数を一つとるのてす が , それをデフォルトて、はクラスのメンバ データの fp に指定している , というコードて、 す。 なんてこういうコードを書いたかという と , 通常ならクラスの正規のデータメンバ て、あるファイルからデータを読み取るが , 特殊ケースては違うファイルのデータを使 って仕事をしたい , と考えたからて、す。 上記のコードは , TurboC 十十てはエラ ーになります。そして , 「 fp というフィール ドはオプジェクトなしては使用てきない」と いう意味のエラーメッセージが出ます。 の件については , 某誌にも書きましたが , 本誌の読者が全員 , その某誌も読むわけて、 はないのて , ここて再度書くことにします。 つまり , C 十十には , 「関数のデフォルト 引数」という一見便利な機構が提供されてい ますが , しかしそのデフォルト引数として , 自分のクラスのメンバデータを指定てきな いのてす。なぜなら , この関数の引数が評 価される時点ては , クラスのオプジェクト がまだどこにも存在していないからてす。 ても , クラスのオプジェクトがメモリ上 に存在するときの , データメンバの所在は , 相対アドレスとしてコンパイル時点て計算 てきるはずてすよね。 C 言語における , 構造 public : VOid rfd( FILE* inf = / ーハー機能のい圧 R\I 誕 4 パソコンが IJN Ⅸ WS の端末に IJN Ⅸ用端末工ミュレータ グラフィス 漢字 語機能 文字コードは、 JIS か MS 漢字コードの 2 種 類から選択。 JIS のモードて、は、全ての文字 コード拡張手順をサポート。 JIS 初期値と JIS 現在値を任意に変更て、きるため、 EUC コードや DEC コードにも完全に対応 フィックス機能 テクトロニクス 4014 端末に準拠したグラフ ィックモード。カラーての出力も可。 最制徒財幾能 U-TERM 機能 RS ー 232C 拡張インターフェースポード 3 チャンネルのうち 1 チャンネルを選択使用。 75baud から 19200baud ( クロック 10MHz 以 上 ) まて使用可、しかも、その高速処理は 群を抜く。フロー制御は XON/XOFF によ る制御法と信号法から選択。 爿イル転送機能 UNIX ホストと DOS ファイルの間て、のテ キストファイル送受信が自在。コマンドは、 UNIX の cu と同様の操作。 その他多彩な機能満載、しかも低価格実現 価格 48 , 000 円 ( 消費税は別途 ) 開発及び販売 第情報数理研究所 fO 「 t ー田ⅵ Ma 廿 1 物 1 Sc ・ Laboratory. ・ 〒ロー東京都豊島区池袋 2-437 . 也袋青柳ビル TEL. 03-3590 ー 52 Ⅱ ( 代表 ) FAX. 03-3590-5353 く資料請求番号 111 〉 NEC ー PC9800 シリーズ EPSON ー PC286 シリーズ ( MS ー DOS パージョン 3.1 以降 ) JIS と重複する画面消去コードを除き、 PC9801 と上位互換を持つように拡張され ている。ビジプルベル、カーソルの形状変 更、プリンタの有無などの制御コードを含 む。これらはローカルに変更可。 C 言語フォーラム 111

4. 月刊 C MAGAZINE 1991年10月号

t001s f0r the 32 environment. C プログラムに 32 ビットパワーを与える / ン実行時にコプロセッサの有無によってエミュレート・ ライプラリとネイテイプ 80387 命令を判別実行出来るよ うに、両方のコードをリンクすることも可能です。 WATCOM C / 386 は、 80386 / 486 プロセッサか持つ 32 ビット・ネイテ •Microsoft C との互換性 Mic 「 osoft C とのライプラリ及びソースレベルでの互 イプモードの ^ イパフォマンス・オプジェクトコードを出力する高性能 換性によって、 WATCOM C / 386 は、 16 ビット DOS な C コンバイラです。コンバイラ自身が 32 ビット・ネイテイプ・モード アプリケーションを 32 ヒットネイテイプ・プロテクトモ ードに移植する理想的な言語処理系となっています。 で動作するため、従来より遥かに大きなソースファイルか高速にコンバ ■リエントラントな生成コード イル可能です。既存の 16 ビット DOS 開発環境を、 32 ピットに移行する WATCOM C / 386 によって生成されるコードは、リエ ことによって、 DOS の 640K バイトメモリ制限を遥かに越えた、最大 ントラントな構造を持っため、複数のスレッドの実行が 4G ( ギガ ) バイトまでのメモリを使用するパフォーマンスの高いアプ 同時にアクテイプになる、割り込み処理等のアプリケー ションか作成可能です。 リケーションがパソコン上で実現出来るようになります。しかも、効率の良い 32 ビットのリニ ア・アドレッシングでの大量テータの高速アクセスかプロセッサ本来の能力を引き出して実現 ■コンバイル管理ユーティリティ WMAKE を標準装備 されるため、アプリケーション・プログラムの実行速度を大幅に向上します。 ・オプジェクト・コードの逆アセンプル・ユー ・ 80386 サポート OS / 4G 」を使用して作成されています。 ティリティ WD 旧 ASM を標準装備 WATCOM C / 386 は、ソースコードの変更や特別なコ ・ポータビリティ ンバイラ・オプションを指定することなく、大きなテー 既存アプリケーションの 386 アーキテクチャへの移行方 ■ 32 ビット・ DOS 工クステンダ「 DOS / 4G ム タ工リアをアクセスできる 32 ピット 386 ネイテイプモー 法は、既存のソース・コードを WATCOM C / 386 で再 「 38 引 DOS EXTENDER 」の両方をサ ド・コードを生成します。 386 固有命令や、洗練された 32 コンバイルし、 4G バイトまでアクセス出来るように ピットリニア・アドレッシンクにより、 WATCOMC / WATCOM C / 386 ライプラリや DOS 工クステンダ・ 386 は 80386 プロセッサの利点を効率よく最大限に引き出 モジュールとリンクするだけです。 します。 8086 / 286 の 64K バイト毎のセグメントの境界や、 ■ ANS 贐準規格を完全にサポート DOS の 640K バイトの制限は、もはや存在しません。さ AN 規格との互換性を調べる P 旧 mHa 日バリテーショ 【対応種類】 PC -9801 シリーズ、 PC/AT 互換機 (J らに、 80486 プロセッサも同様にサポートします。 ン・スート・テストを完全に合格し、 100 % ANS ー規格 3100 シリーズ、各社 AX 仕様機、 PS / 55 シリーÄ) ■プロテクトモード・コンバイラ を満たした C コンバイラであることが証明されています。 ( 但し、 80386 又は 80486 プロセッサ搭載機に限る ) WATCOM C / 386 バッケージには、リアルモードで動 ■強力なオプティマイサ 【対応 DOS 工クステンダ】 作するコンバイラとネイテイプ・プロテクトモードて動 先進的なレジスタ割り当てと、命令の使用とともにフロ DOS/4G 、 38 田 DOS EXTENDER 作するプロテクトモード・コンバイラの 2 種類のコンバ ー解析を行うことによって、生成されたコードをさらに 【動作環境】 MS-DOS V3.1 以上 イラが含まれています。プロテクトモード・コンバイラ 最適化します。これによって、 WATCOM 社でテスト 【必要メモリ】 2.6M バイト以上 を使用することによって、従来のリアルモード動作のコ した他の全ての 80386 C コンバイラの中で、最も速く、 ンバイラで使用していた 640K バイトメモリより遥かに大 小さいコードを生成します。 ¥ 198 , 000 シングル・ライセンス きなメモリを使用してコンバイルが行えるため、より大 ■ 80387 数値演算コプロセッサ・サポート きなソースプログラムがオン・メモリで高速に処理でき ¥ 594 , 000 浮動小数点演算工ミュレーションか、ネイティフ 80387 命 コーポレート・ライセンス るようになります。この、プロテクトモード・コンバイ 令かを選択することができます。また、アプリケーショ ラは、 80386 / 486 プロセッサ用 DOS 工クステンタ「 D お問い合わせは・・・株凵 FEBOAT 営業 1 課 (tel. 03-3293-4714 ) までこ連絡ください。 株式会社 LIFEBOAT * DOS/4G, DOS 月 6M は、米国 RationaI Systems c. の登録商標です。 * WATCOM C は、加国 ・ Copyright NOtice 抦 c. の登録商標です。 * MS ・ DOS. MS は Microsoft 「 p. の登録商標です * その他、プログラム名、シ ステム名、 CPU 名は一般に各メーカーの登録商標です。 〒圓ー東京都千代田区神田錦町 3 ー 6 PHONE : 03-3293-47 Ⅱ代 FAX : 03-3293-4 引 0

5. 月刊 C MAGAZINE 1991年10月号

LANGUAGE ログラムの 他人の作っこ 上手な解析方法 實① Art of Reverse 廱羆 i 羆・① ri 羆 Robert S. Swanke/ 岩谷宏訳 (COMPUTER LANGUAGE, June 1991 ) 提携記事 自分でプログラムを新規に書いた方か楽な場合もある。 しかし道具とテクニック次第では , ソースコードのな い既存のプログラムでも , 十分に仕事かできる。 を作りだし , 逆コンパイラは C などコンパイ 開始点とする。 リ八スエンジニアリング ラ言語のソースを作りだします〔訳注 : デ 逆コンパイラは , 市販品を私は知りませ ん。コンパイラは , べンダごとに動作が違 イスクエデイタ = ディスクのトラック , セ ったり , 同じべンダのものて、もバージョン ソースコードも , そいつを書いたプログ クタなど , 物理的な記録単位をエディット による違いがあるのて、 , 逆コンパイラを作 する道具〕。 ラマも共にいなくて , 週末まて、に人間ワザ て、は不可能な〔納期の厳しい〕仕事が要求 MS ー DOS の実行プログラムには , 元のソ るのは難しいのて、す。実際に使うためには , されているとき , 私はリバースエンジニア 自分て、たくさんの逆コンパイラを書くしか ースのコメントが残っていませんし , また , リングの様々なテクニックを駆使します。 コード部とデータ部の区別もはっきり分か ないて、しよう。 デバッガは , ふつうは自分が作ったプロ この方面のテクニックは一種の職人芸て、す りませんから , 解析用のユーティリティ類 は , 以下のような情報に依存して仕事をせ グラムのバグを退治するための道具だ , と から , 私がここて、ご紹介するものは , 読者 思われています。しかし , デバッガを使っ にとって単に参考にすぎません。独自の応 ざるをえません。 て他人の作ったプログラムの内部を覗いて 用を工夫して , あなたもリッパなリバース ・インテル 80X86 の命令セットを手がかり みることが , 役に立っこともあるのて、す。 工ンジニアになってください〔訳注 : reve に , コード部とデータ部を見分け , 適当 ただし , デバッガが持っている逆アセンプ なコメントを〔再現したソースに〕付け rseengineering= 逆工ンジニアリング = 逆 アセンプルをも含む , より広義の分解・解 ル機能は , それを使ってプログラムの全体 像を知ることは不可能てあり , その意味て、 , 析・再組立作業〕。 ・ IBM PC の割り込みや I / O ポートに関する リバースエンジニアの道具箱には通常 , 専門の逆アセンプラほど役には立ちません。 公開情報を頼りに , 割り込み終了以降の ディスクエデイタは , MS-DOS フォーマ 逆アセンフラ , 逆コンノヾイラ , デノヾッガ , プログラムの流れを判断し , コメントを ット以外のディスクて、も調べることがて、き ディスクエデイタなどが入っています。そ 付ける。 れぞれ , 仕事の役割が違います。逆アセン るし , また < パッチをあてる > ことによっ ・ MS-DOS の . COM, . EXE, . SYS などのプ て , 再アセンプルやリンクをせずに , プロ プラと逆コンパイラは , 実行プログラムを ログラムの構造に関する文献情報から , グラムの動作を変えることがて、きます〔訳 ソースコードのファイルに変えます。逆ア プログラムのエントリポイント ( 入口 ) の センプラは , ( そのプログラムが元々は C て、 注 : パッチをあてる = ディスク上の実行プ 見当をつけ , そこにもさらにコメントを 書かれていた場合て、も ) アセンプラのソース ログラムの一部を直接的に書き換えてしま 付けるとともに , そこを逆アセンプルの 42 C MAGAZINE 1 1 10

6. 月刊 C MAGAZINE 1991年10月号

S 鈆日 C 、ロプロクラミング A>telnet sparcl( ← SPARC LT のホス ト名 ) とすると以下のように表示されて login 状態 TELNET for PC9800 Version 3.10.01 (Aug. 1, 199 の (C) Copyright ASCII Corporation, 19 90. Press ' STOP' for Set-Up mode. コネクト中 .. sparcl にコネクトしました。 工スケープ文字の設定は 'A ] ' です。 Fig. 2 /ect/hosts ファイルの内容 cat hosts # Sun Host Database # げ the NIS is 「 unning. this file is 0 可 y consulted when booting 127.0.0.1 localhost 192.9.200.1 spa 「 cl loghost 192.9.200.2 sparc2 192.9.200.3 spa 「 c3 192.9.200.4 sparc4 192.9.200.150 j31 192.9.200.200 nec981an 192.9.200.210 sparc 192.9.200.220 mysony sparcl # SunOS UNIX (sparcl) て、あるが , 以下のように /etc/hosts に PC-9 INETBIOS = *CTERM 801 側のホスト名とその IP アドレスを書き込 TERM = nec981an login : む。左の数字が IP アドレスて , 右側がホス また PC ー 9801 の IP アドレスは , AngeLan こて、 ID ネームおよびパスワードを入力 ト名て、ある。ホスト名には , 別名を付加す 98 に添付されているユーティリティ inetbio してから , プログラムを起動する。 ることがてき , それは右側に書き添える。 s を起動して , 以下のように設定する。 プログラムの実行 このファイルて、は PC ー 9801 側のホスト名を A : inetbios 192.9.200.200 nec981an と設定している。アドレスの先頭 力ソルキーの設定 ローカル側 , すなわち PC ー 9801 から SPA が 192 以上になっているのて、 , クラス C て、あ 本プログラムてはカーソルキーて、メニュ ることがわかる。したがって , 左から 3 バイ RC LT にアクセスし , LOGIN する。その 後 , プロンプトが出た段階て、「 markndb7 」と ー選択を行うのて , カーソルキーに割り当 トがネットワーク番号 , 最後の 1 バイトがホ てられているコードと 8 月号て、紹介した term 入力する。 スト番号て、ある。なお , 最初の localhost は ループバック用のものて、必ず記入しておく info ファイルて定義したものが一致していな % markndb7 くてはならない。 8 月号のものは通常 MS-D すると Fig. 3 のようなメニュー画面が現れ 必要がある (Fig. 2 ) 。 る。ここて、国キーてバーを移動し , 窓口会 PC ー 9801 側のネットワーク番号は , SPA OS て、割り当てられているコードを定義した RC LT 側のホスト名に対応するネットワー ものてあるが , AngeLan98 を起動するとこ 計処理を選択する。 ク番号に合わせなくてはならない。 SPARC れが書き換えられてしまうのて、 , カーソル すると Fig. 4 のような画面が現れ , 商品コ LT 側のホスト名を確認するには , 以下のよ ードの入力待ちになる。 キーが使えなくなってしまう 0AngeLan98 うに hostname コマンドを使用すればよい には , キーのコードを割り付けるユーティ このコードの入力には , 本連載第 1 回のプ リティが添付されているのて、 , このユーテ ログラムて、打ち出したバーコードを利用す # hostname ィリティを使用してカーソルキーのコード る。入力が行われると , そのコードに対応 sparcl PC ー 9801 側の設定は , 上記の /etc/hosts フ を対応させる必要がある。 する商品名 , 単価およびそれまての合計額 ァイルと同じ内容のファイルを hosts という が表示される。各商品の個数については 1 個 がデフォルトに設定されており , すぐに次 ファイル名て ( MS ー DOS の ) ディスク上に収 録しておく。この収録場所は , 環境変数 IN の商品名の入力となる。個数を入力したい ETBIOS に設定されているディレクトリて 場合には , 商品名の入力時に / を入力す ィーサネットによる通信を開始するには , る。すると個数入力のルーチンに入るのて , ある。また PC ー 9801 のホスト名は環境変数 T PC ー 9801 の側から以下のように telnet を起動 ERM に設定する。 すればよい そこて、個数を入力する。 SPARC LT プログラミング 125 ネットワークの起動

7. 月刊 C MAGAZINE 1991年10月号

特集 PC -9801 版 CompiIer 択て、きる。これについても同様に , 実効ア ドレスのサイズをデフォルトとは別のサイ ズに指定する前置バイト 0X67 が存在する。 このような妙な方法がとられたのは , 80 86 のアドレッシングモードにリザープが少 なく , 通常の方法て、は互換性を保ったまま て、 32 ビットへの拡張がて、きなかったためて、 ある。 本来 8086 / 80286 用に作られたコードの場 合はデフォルトビットを 0 にすることになる が , はじめから 80386 を想定してコードを生 成する場合は , デフォルトビットを 1 にし て , サイズ指定前置バイトがないときには , オペランドやアドレスが 32 ビットとなるよ うにしたほうが , 一般にコードが短くなる。 そのため , djgcc の出力するコードは , デ フォルトビットが 1 の状態て、走る。したがっ て , djgcc て、は , short ( 16 ビット ) よりも , i nt および long ( どちらも 32 ビット ) のデータの アクセスのほうが , 一般にコードがコンノヾ クトになる。もしデータのサイズ ( コード中 の即値オペランドを含む ) が少々増えても , オペコードを短くしたい場合には , short よ りも int を使ったほうがよい ただし , short を long に変えることによっ て使用メモリ量が増え , 結果的に速度が落 ちる可能性はある。大きな配列などは , デ ータが 16 ビットに収まることがわかってい れば , short て、宣言したほうがよいといえ また , 今まて、のリアルモードのコンパイ ラては 32 ビットの幅が必要なデータを long て、宣言していたが , djgcc ては int が 32 ビット になったのてその必要はなくなった。実際 , GNU などのワークステーション用のソフト ウェアては , int の幅が 32 ビット以上あるこ とを仮定したコードが書かれていることも 多い。しかし , リアルモードのコンパイラ に通す可能性を考慮すると , 自分て、作るソ フトウェアては , 32 ビットてなければなら ないデータは , はっきり long て宣言してお いたほうがよい 8 ビットのデータに関しては , djgcc かリア ルモードのコンパイラかにかかわらす , ch ar がサイズの点て、も速度の点て、も有利てあ 以上のように考えると , djgcc だけて、なく 従来のリアルモードのコンパイラて、もコン パイルする可能性があるプログラムは , Ta ble 3 のような方針て、データ型を宣言すれば よいだろう。 ビット数が 64 ビット必要なデータは , djg cc て、は longlong という型て、宣言て、きる。た だし , 80386 には 64 ビットの演算命令がない のて、 , 実際の計算は 32 ビットの計算を複数 回行うことによって実行される。とはいっ ても , その演算ルーチンはアセンプリ言語 て、書かれているのて、 , C 言語て、 int の演算を組 み合わせた演算ルーチンを書くよりはずっ と速い この longlong も便利に使える場合がある が , ポータビリティを重視する場合には , 後述するように , 条件コンパイルをしたほ うがよい いる領域を差し引くと , 640K バイト以下に はこれからさらに ROM や VRAM に使われて きる最大メモリは IM バイトて、ある。実際に リアルモードて、は , 通常の方法て、利用て、 IM バイトバリアを忘れよう 64K バイトバリア・ ・ EMS メモリ ・バンク切り換えメモリ ・プログラムのオーバレイ この限界を超えるために なってしまう。 を必要とするプログラムを動かすことがて て , 実装されている実メモリ以上のメモリ さらに , g 。 32 の仮想記憶機構を利用し 有効に活用て、きる。 がて、きるのて、 , IM バイト以上の実メモリを ットアドレッシングによるメモリアクセス それに対して , g032 を使うと完全な 32 ビ 実行速度の低下にもつながる欠点がある。 ログラム作成の手間が大きく増えるうえ , といった手法が取られてきたが , どれもプ きる。 また , 80386 て、はセグメンテーション機構 の最大の問題て、あったセグメントの 64K バイ ト制限がなくなっている。これによって , セグメントの変更を必要以上に頻繁に行う ことがなくなったため , 通常のアプリケー ションてはセグメントの存在を意識しなく てもよくなった。 ① ② ③ ④ ⑤ このため , 今まて、は , ほかのデータとともにデータセグメン ごく小さな配 トに入れられるような , MS メモリ , UMB などに置いて , EMM 物理メモリの大きさ以内の配列 → huge;* インタ IM バイト以内のメモリに収まる配列 ar ポインタ 64K バイト以内の大きさの配列 列→ near;* インタ コール , XMM コールなどを発行して参 昭 物理メモリに入りきれない配列→デ イスクの読み書きを含めた独自の管理 ルーチンを自作 という複雑な使い分けが必要て、あったが , 特集一 98 田版 GNU C Compiler 69 る。 に書く必要がなくなった , ということてあ にデータが入りきれない場合の処理を特別 イト以内の領域に収めたり , メインメモリ して配列を 64K バイト以内 , あるいは IM バ まう。あくまても , 今まてのように無理を メモリを浪費しすぎると速度が低下してし あるわけてはないのて , 仮想記憶に頼って もちろん , 実際の物理メモリは無尽蔵に する。 ったときと比べて , 実行速度が大きく向上 インタ , 独自の配列管理ルーチンなどを使 が大きく上がるほか , far;* インタ ,huge;* これによって , ソフトウェアの開発効率 通常のポインタを使って実現て、きる。 も , 仮想記憶機構を利用することによって , ンタて扱うことがてきる。また⑤について djgcc を使えば , ① ~ ④をすべて単一のポイ メモリ参照のオフセットが 32 ビットて、ある

8. 月刊 C MAGAZINE 1991年10月号

が , この Ver. 2.1 て、は改善されているよう なお ,dhrystone はコードの修正は許され ていない テストの結果て、あるドライストーン値を Table 6 にまとめた。参考まて、に , UNIX の ワークステーションて、 GCC と CC ( PCC ) を使 って得られたドライストーン値を合わせて 載せておいた (Table 7 ) 。 さすがに High C 386 は , 80386 をターゲ ットとして開発されただけあって , 十分な 最適化が行われ , 優れたコードを生成して いるようだ。これに対して GCC は , さまざま な CPU て、動作するように設計されているの printf ("read time %. 3f, speed = %. 3f Mbytes/sec#n ” , readtime, 57 : } みた。このウェットストーンは , FORTRA N の whetstone を C 言語に移植した cwhetsto ne と呼ばれているバーションて、ある。これ は , 浮動小数によるさまざまな数値演算 ( 三 角関数や配列など ) を実行して , その性能を ウェットストーン値として与える。 なお , cwhetstone のコード修正は許され ていない テストの結果て、あるウェットストーン値 を TabIe 8 にまとめた。 まず 80387 などの数値演算プロセッサを搭 載してないマシンて、テストを行ったが , Hi ghC 386 以外は値を測定て、きなかった。こ れは , 80387 の代わりにエミュレーションソ 8 : 9 : 10 : 11 : 12 : 13 : 14 : 15 : 17 : 18 : 19 : 20 : 21 : 22 : 23 : 24 : 25 : 26 : 27 : 28 : 29 : 30 : 31 : 32 : 33 : 34 : 35 : 36 : 37 : 38 : 39 : 40 : 41 : 42 : 43 : 44 : 45 : 46 : 47 : 48 : 49 : 50 : 51 : 52 : 53 : 54 : 55 : 56 : diskio List 4 float filesize; int nblocks; struct stat sbuf; float writetime, readtime; time_t start, end; register char* buf; register int i, j; main(int argc, char** argv) { 7 : #define MBYTES 16 6 : / * キャッシュサイズより多くすること * / 4 : #include く sys/stat. h 〉 3 : #include く sys/time. h 〉 2 : #include く sys/types. h 〉 1 : #include く sys/file. h> て、少し差がついている。 浮動小数演算のべンチマークとしては倍 ~ 浮動小数演算 に手を加えているのかもしれない ) 。 あると考えられる ( もしかすると md ファイル の形式と DOS 工クステンダの仕様の違いに われる。この違いは , オプジェクトコード 生成するコードはそれほど違いがないと思 は同じ Ver. 1.39 をベースにしているのて、 , が , 少し djgcc が劣っている。ふたつの GCC また , ふたつの GCC は , それほど大差ない ルの最適化に期待したい たコードを生成する ) 。これからの md ファイ 分最適化されており , 付属の CC よりも優れ UN や HP という 68000 の md ファイルは , 十 いないためて、あろうと思われる ( たとえば S だ 80386 用の md ファイルが十分最適化されて 86 て、十分な性能を発揮していないのは , ま クトなコード生成が実現される。 GCC が 803 ァイルに記述することて , 高速かっコンパ れるが , 後者は CPU ごとに用意される md フ る。前者は , いかなる CPU に対しても行わ インストラクションの使用など ) に分けられ に依存する最適化 ( レジスタの使用 , 高機能 ( 定数伝播や共通部分式の削除など ) と CPU GCC の最適化は , CPU に依存しない最適化 1 1 10 精度ウェットストーン ( whetstone ) を試して 80 C MAGAZINE printf("Run this on an idle system. *n") ; if (argc く 2 ) { printf("Give fi lename as argument. ; exit(l); * ライトテスト j = creat(argvC1], 0666 ) ; / * find optimum blocksize * / fstat(), &sbuf) ; sbuf. st_blksize) ; printf( ” blocksize = Xd}n ” buf ー (char * ) malloc(sbuf. st_blksize) ; nblocks ニ (MBYTES*1024*100 の /sbuf. st_blksize; = (nblocks * sbuf. st ー blksize ) / ( 1024 * 100 の ; filesize time(&start); for (i = 0 ; i く nblocks; i + + ) write(), buf, sbuf. st-blksize); time(&end) ; start) : ニ ((end ー 1 ) writetime printf("write time = %. 3f, speed = %. 3f MbYtes/sec}n", writetime' close(j); * リードテスト j ニ open(argvC1], の ; time(&start) ; filesize/writetime) ; for (i = 0 ; i く nblocks; i + + ) read(), buf, sbuf. st blksize) ; readtime start) ; ニ ((end ー 1 ) ー time(&end) ; close(j) ; * 平均 unlink(argv[l]) ; fi lesize/readtime) ; filesize/((writetime + readtime)/2)); printf("Average I/O performance = %. 3f Mbytes/sec*n ” ,

9. 月刊 C MAGAZINE 1991年10月号

特集 PC ー 9801 版盟 compiler きを考えよう。ある関数の中て、ほかの関数 ようなページヒット時のオーバヘッドがな のソースコードが存在する場合は , ソース の呼び出しによってほかの関数に制御が移 い方法をとったのは賢明だろう。 コードの対応する行が表示される。 ったとき , 呼ばれた関数まて、ステップ実行 また , あらゆるアドレス指定には , ソー 外部プログラムの起動 されるのはわずらわしい場合がある。この スコードて、定義された関数名・変数名など のシンポルと , それらを含む式が使える。 ような場合には , step て、なく next を使えば , また , g032 上て、動作するアプリケーショ ンから , system ( ) 関数によって外部プログ データ型に応じた変数の値の表示などは デバッグしたい関数の中のコードだけをス ラムを起動する場合には , g032 上て、動いて て、きず , 単にメモリのダンプがて、きるだけ テップ実行て、きる。 いるアプリケーションやペーシテープルだ て、ある。ただし , ダンプの際に , グローバ ル変数の場合は , アドレスをラベル ( = 変数 けてなく , g032 の本体がほば完全にディス 名 ) て、指定て、きるのて、 , 多少手間は減る。 クにスワップアウトされる。したがって , 起動される外部プログラムては , g032 が起 ソースレベルデバッガとして最小限必要 動されたときに残っていたメモリがほばす な機能は揃っているといえる。 べて利用て、きることになる。 実行状況の表示 テパッガ debug32 上て、アプリケーションを実行させ ると , 画面のいちばん下のファンクション キー表示行を使って , djgcc に付属している debug32 は , プログ ラムをデバッグするときに g032 の代わりに ・実行中のプログラムのファイル名 ・現在のプログラムカウンタの値 使う , デバッガ機能を内蔵した工クステン ・ディスクに追い出されたメモリ量 ダて、ある。 ・使用済みメモリ量 debug32 は , g032 のソースを -DDEBUGG ・未使用メモリ量 ER= 1 というコンパイルオプションをつけて などの実行状況が表示される。 コンパイルすることによって生成されたも のなのて、 , g032 の機能をすべて含んて、い ディスクに追い出されたメモリ量・使用 済みメモリ量・未使用メモリ量については リアルタイムて、表示が書き換えられる。 debug32 には , れは , デバッグに役立つのはもちろんだが , ・ステップ実行 ・サプルーチンコールを一命令として扱 メモリの使用状況を見張ることによって , プログラムのどの部分がメモリを食ってい うステップ実行 ・プレークポイントの設定 るかを調べ , チューニングに利用すること ・レジスタの内容の表示と変更 もてきる。 このようなステータス表示は , 工クステ ・メモリの内容の表示と変更 ・コードの逆アセンプル表示 ンダとデバッガが一体となっている debug3 2 ならて、はの機能といえるだろう。 ・ 80387 ステータスの表示 ・シンポル情報の表示 ステップ実行 といった機能がある。 ソースレベルテパッグ機能 コードの逆アセンプル表示の際には , オ プジェクトが一 g オプションによってシンポ ル情報つきてコンパイルされていれば , 対 応するラベルが表示される。 さらに , 現在デバッグ中のオプジェクト ライプラリ djgcc には , 以下のような豊富なライプラ リ群が付属している。 ・ C/C 十十ライプラリ ・グラフィックスライプラリ ・ PC ライプラリ ・数値演算ライプラリ ・ bison ライプラリ このうち , IBM-PC に依存しているのは グラフィックスライプラリと PC ライプラリ ( の一部 ) て、ある。 : て・ = = 0 ら 00 イプリ 0 = 0 、説 C / C 十十ライプラリ djgcc に付属している C / C 十十ライプラリ には , 次のようなものがある。 ・ DOS ライプラリ (libsrc/c/dos) 一般ライプラリ (libsrc/c/gen, libsrc/c/ lib) ・ GNU ライプラリ (libsrc/c/gnu) ・ C 十十ライプラリ (libsrc/c/gpp) ・入出力ライプラリ (libsrc/io) ・文字列ライプラリ (libsrc/str) ・システムライプラリ (libsrc/sys) これらをひとつひとっ説明するにはペー ジが足りないのて、 , 通常のコンパイラと異 なる点だけを解説する。 GNU ライプラリ GNU ライプラリには , djgcc が出力するコ ードが呼び出すコンパイラサポート関数が 特集 PC -98 田版 GNU C Compiler 59 ステップ実行にはふたつのコマンドがあ ・ step : 単純に一命令ずっ実行する ・ next : 通常の命令はひとつずっ実行する が , サプルーチンコールは次のリター ンまてを一度に実行する ある特定の関数だけをデバッグしたいと

10. 月刊 C MAGAZINE 1991年10月号

CB の規定 ) に従う。 布物と , そのソフトウェアの機能や効 リ実行形式をつけることがて、きるが , 以上のように , djgcc の配布規定はかなり その際には , 全販売価格の 5 % または 1 用を述べた広告に入れること 複雑だが , UCB の規定も djcode の規定も G コピーあたり 5 米ドルのうち , 多いほう ③のうち , D. J. DeI 。 rie 氏が最初から自 PL の規定よりは緩いものなのて、 , GPL の規 分て作成したコード ( 配布規定て、は djcode と の金額を , ロイヤリティとして D. J. D 定どおりに配布するかぎりは , 問題は起こ 呼ばれている ) は , 基本的に GPL に基づいて elorie 氏に支払う必要がある。ただし , らないと思われる。 いるが , 次のような例外規定があり , ほか 非営利目的の配布については個別に例 外を認める場合がある。 のソフトウェアに組み込む際の制限が多少 [ 参考文献 ] (3)djcode を必要とするが , GPL に基づか 緩和されている。 [ 1 ] 前川守『岩波講座ソフトウェア科学 6 ずに配布されるアプリケーションを開 ( 1 ) djcode を必要とし , なおかっ GPL に基 オペレーティングシステム』 , 岩波書 発した人または団体は , djcode につい づいて配布されるアプリケーションの 店 , 1988 年 て , ソースコードを入手および再配布 バイナリ実行形式には , djcode のバイ [ 2 ] W. B. Surjant 「 80386 の使い方』 , オー する権利など GPL て、認められているあ ナリ実行形式をつけることがてきる。 ム社 , 1987 年 らゆる権利を放棄したことになり , 例 djcode のソースファイルは , そのアプ [ 3 ] 明石真平「 386 マシン徹底活用講座 外 ( 2 ) に基づいて djcode の実行形式を配 リケーションのソースファイルととも 386 de MS-DOS 」 fSuperASCII 』 199 に GPL に従って入手可能て、なければな 布することしか許されない 0 年 8 月号 ~ 1991 年 5 月号 ただし , FSF や UCB のコードに対する D. らない [ 4 ] 吉田英樹「 GCC / g + + の展望」℃マガジ J. DeI 。 rie 氏の変更点については , 著作権は (2)djcode を必要とするが , GPL に基づか ン』 1990 年 7 月号 D. J. DeIorie 氏が持っているが , 配布規定 ずに配布されるアプリケーションのバ はオリジナルのコードの規定 ( FSF および U イナリ実行形式には , djcode のバイナ 安田英之 Part2—djgcc の PCー9801 移植 Y. Shibata 氏による移植作業によって , dJgc c 十 g032 が旧 M - PC だけでなく PC ー 9801 上でも 利用できるようになった。移植に伴う変更点と , PC ー 9801 版独自の拡張機能について説明する。ま た移植者からのコメントも紹介する。 る。このパッチは Y. Shibata 氏が作成した その後も , オリジナルの djgcc がバージョ ものて , 日経 MIX などて、配布されている。 ンアップするごとに PC ー 9801 版もそれに対応 PC ー 9801 版 djgcc の最初のバージョンは , して変更されているほか , 7 月には , VCPI ' 91 年 4 月に配布が開始されている。 対応という , オリジナルにもない機能が追加 これは , オリジナルの djgcc の配布が ' 91 年 されたパッチが配布がされるようになった。 2 月に始まったことを考えると , かなり早い こて、はこの PC ー 9801 版の djgcc について といえる。 解説する。 はじめに オリジナルの djgcc は , IBM-PC て、動作す るものだが , これにパッチをあてると , 80 386 を搭載した PC ー 9801 て使えるようにな 64 C MAGAZINE 1 1 10