必要 - みる会図書館


検索対象: 月刊 C MAGAZINE 1990年2月号
105件見つかりました。

1. 月刊 C MAGAZINE 1990年2月号

三田典玄の 実践 C プログラマ 養成講座 第⑤回日 S ー 232C の制御 行のこの種のマニュアルは部品会社が普通 10 TREM. RESMAKEFILE に使われ はただて、お客に配るものなのて、 , あまり手 るリンカ応答ファイル に入らないかもしれない パソコンそのもののこういった資 以上の . C ファイルと . ASM ファイルを 9 の 料はメーカーによっては社外秘扱いて、一般 MAKEFILE て、アセンプル / コンパイル / リ デバイスドライバ本体 1 S 工 0 . C には出してくれないものも多い。仮に出て ンクするとサンプルの通信ソフトがて、きあ タイマ割り込みサービ 2 SIGALM . C いたとしてもプログラムを組むのに必要な こから先は各自の好みに応じてプ がる。 スノレーチン 肝心な部分が書かれていなかったり , ある ログラムを拡張してみるとよい RS ー 232C の割り込みサ 3 RSINT. ASM べき表などの類が不足していたり , とにか ービスルーチン く不親切このうえない。アメリカの IBM-PC 4 SIGALMS. ASM タイマ割り込みサービ とそのコンパチて、あれば , まずメーカーが スノレーチン そんな意地悪をユーザにすることはないの アセンプラて、の CLI , 5 CLI. ASM て、安心て、きる。 このプログラムはハードウェアをやった STI 命令を C 言語て、呼 私もこのプログラムをつくるにあたって ことがないとたいへん難しく見えるはずて、 べるようにしたもの はメーカーに関係する某所からいろいろな ある。このプログラムを読む ( 書く ) ために RS ー 232C ライプラリの 情報をウラから項くこともあった , 必要な資料の一部は , ソフトウェア関係の 利用のためのヘッダフ ことをここに書いておこう。とにかくそう 資料だけて、はないのて、 , 書店て、は売ってい ァイル いった「政治カ ( ? ) 」もときには技術者には ないものもある。 タイマ割り込みライプ 7 SIGALM . H 必要になることも多いのだ。 たとえばここて、使っているパソコン内部 ラリの利用のためのヘ の IC チップそのものの資料は必須だが , ッダファイル 般の書店て、はそのマニュアルは手に入らな ライプラリ使用方法を いのが普通て、ある。 知るためのサンプルプ チップのマニュアルは , 東京て、あれば秋 ロクヾラム C 言語とアセンプラルーチンを組み合わせ 葉原の部品屋さんにマニュアルをコヒ。ーし 9 MAKEFILE 以上のルーチンをまと る場合は , 必ずその C 言語特有のクセをきち てもらうか , あるいはマニュアルそのもの める MS-MAKE 用の んと認識しなければならない。そのため , を買ってくるとよい。しかし , メーカー発 MAKEFILE プログラムは 1 行 1 行慎重に行う必要のある マあ のはもちろんのこと , アセンプラとのリン ク時にはコンパイルスイッチなどソースリ スト上に現れない問題があまたあることも 知らなければならない 私は今回のアセンプラルーチンを C 言語コ ンパイラに書かせた。この方法はけっこう 有効て、ある。つまり , 今回使った MS - C て、は 「 -Fa 」というスイッチがあり , これを使って まず C 言語のプログラムの簡単なものを書 き , それをコンパイルし , アセンプラソー スリストを得るわけて、ある。そしてそのア センプラルーチンを書き換えて , 必要なア センプラブログラムを書くわけて、ある。 の方法を使うと , 8086 系 CPU などて、はとく プログラムファイルの内容 ハードウェアに関連する プログラムに必要な資料 6 S 工 0 . H メーカーの C 言語フログラム 特有の間題とアセンプラ 8 TERM. C ◆・ ク 手レ 7 け 106 CMAGAZINE 19 2

2. 月刊 C MAGAZINE 1990年2月号

三田典玄の 実践 C プログラマ 養成講座 - 5 回 業界て、安全に生きていくためには必要なこ とかもしれない それに「使いましたよ」という話を聞くの は著者としては嬉しいことなのて、 , 編集部 まて、ご一報いただければ , 金一封が出る , なんてことはまずない 4 関数を使用するためのドキュメントは SIODOC. TXT というファイルに記述してあ 5 このプログラムに関する問い合わせはい っさい受けつけない なぜかというと , プ ログラムのソースリストがすべて公開され ているのだから , わからないことがあった ら , 自分て、解析すべきて、はないか , という 筆者のポリシーによる。 6 C 言語の標準ライプラリは , LLIBCE. LIB にめんどうなセグメント名の指定などのプ たい という名前 ( すなわち MS-C Ver5.1 のコン なお , 筆者はこのプログラムと同じイン ログラム以前の部分を自動的に生成してく バインドライプラリの名前 ) になっている。 タフェイス仕様をもった RS -232C 非同期ド れるのて、 , 手間がかからないばかりて、はな ライプラリをバラして使っている方は , も くまちがいも少なくなる。それにアセンプ ライバを , . このほかにも各社のパソコン用 ちろん , そのライプラリに直す必要がある。 にそれぞれ数種類もっている。実際に仕事 ラをよく知らない場合は , ここを入口にア 7 EXE ファイルの実行にあたっては , 必ず て、プログラムを組む場合はこの「モジュール センプラの勉強もて、きるだろう。 マシン名を環境変数にセットする必要があ 化」によって省力化を図るわけて、ある。 たしかに手抜き , といわれてもしかたな る。なにもセットされていないと PC9801 て、 いかもしれないが , 商売のプログラムて、あ あるとみなす。環境変数のセットの仕方は ればこの方法のほうが少ない時間て、プログ SIO. C の冒頭に記してある。 ラムが書けるはずて、 , コスト削減にもつな 8 サンプルのプログラム「 term. c 」はコメン がる手法て、ある。コンピュータは人間がラ トを入れてもたった 60 行なのて、解説を必要 1 MAKEFILE 中のコンノヾイルスイッチの クをするために生まれてきたものなのだか としないと思うが , 見てわかるとおりライ うち , -Gs は必須てある。割り込みを使った らこういう使い方て、ラクをしてもバチは当 プラリの最低限の使い方を記したものて、あ プログラムにおいてはスタックチェックル たらない たとえばストッ って , 実用には適さない ーチンが入るとまったく動かなくなる。 プキーなどの処理はいっさいやっていない れは割り込まれたさきて、のスタックチェッ 以上 , 解説というよりはプログラムのつ ほんとうに工ッセンスだけをわかりやすく クがひっかかって , スタック異常とまちが くり方になってしまったが , プログラム 1 行 見せるためのものて、ある。 1 行の解説は実際にソフトウェア , ハードウ われてしまうためて、ある。 みなさんがプログラムをつくる段階て、は , 2 この関数群は MS ー C のラージモデル用につ ェアの資料と首っ引きて、ソースリストをご もちろん画面の美しい処理のほかにも必要 くられた。ほかのモデルにして動かす場合 覧いただきたい。筆者としてはかなり強引 な基本機能はたくさんある。 は少しくふうが必要て、ある。 なプログラミングをした部分もあり , 掲載 9 このプログラムはハードウェアを直接ア 3 このプログラムはどこて、どのように改造 するのはけっこう恥ずかしい。数学的美し クセスしているのて、 , たとえば PC9801 のメ し使っても , 原著者にはいっさい断わりを さについてはいっさい考えていない モリスイッチや ROM-BIOS とはいっさい関 いれなくてもよい。完全な Free Ware とす 後て、読めてバグ取りがて、きて , ちゃんと 係なく動く。 る。ただし , いちおう仁義としては作成者 動けばよいのて、ある。といいつつ見にくい に「使いました」と言っておくことは , この 部分もあるかもしれないがご容赦いただき 他わレマ い尨き Cc 0 あ・そう ど・つゾ冬 0 0 0 0 注意事項 108 - CMAGAZJNEv 、 , 19 2

3. 月刊 C MAGAZINE 1990年2月号

UN Ⅸを目指すのか STAGE 1 STAGE 2 STAGE 3 STAGE4 A 侊 5 STAGE6 STAGE7 STAGE 8 A 侊 9 IJN Ⅸの開発環境 IJN Ⅸと MS - DOS のコマンドの対比 正規表現 ファイルシステム プロセス MS ー DOS ユーサのための実用 IJN Ⅸ入門 IJN Ⅸワークステーションのシステム構成 IJN Ⅸの系譜 IJ N Ⅸ関連書籍 A 傔 10 IJN Ⅸの将来 石田晴久 笠原正治 川原稔 石垣裕 三浦文 石田晴久 秋津彰文 三田典玄 石田秋也 ク機能や , それによる情報交換 ( 含 PDS ) な どについて述べる。 ソフトウェア工ンジニア の生活環境 ソフトウェア開発を専門に行うソフトウ ェア工ンジニア ( 開発者 ) にとって , 仕事が もづともやりやすい環境とはいったいどん なものてあろうか。望ましいと思われる項 目をいくっか挙げてみよう。 ①いって、も使えるコンヒ。ュータが手元 にある。これは必須てある。「コンピュータ てなくても端末機 (TSS の ) て、あってもいい てはないか」といわれそうだが , TSS ( 時分 割システム ) だと込み具合によって応答速度 が変わり , 計算機室が休みのときは使えな いから , 自分て専有てきるマシンがよい そういうマシンは , ノヾソコンかワークステ ーション (WS) となるが , てきることならパ ソコンよりはもっと強力な WS にしたい ②さて , WS を専有して ( もしくはマル チ端末にして数人て、 ) 使えるとなったら , ソ フトウェアをて、きるだけ効率的に開発す るためのツール ( 道具 ) が整備されているシ ステムにしたい。大工さんがいい道具をも つのと同じことて、ある OWS はパソコンより 画面が大きく , マルチウインドウが表示て きるから , ウインドウを次々に切り換えて いくことて , 仕事の能率がいっそう上げら れる。 ③ソフトウェアの開発中には , 仲間や 外部の人々との連絡が必要となることが多 い。場合によっては , いくっかのほかのコ ンピュータに直接アクセスする必要もてて くる。このため , コンヒ。ュータネットワー クが重要になるが , ネットワークがあれば WS をそれにつなぐのは容易て、ある。 ④ソフトウェア開発には , 人手も金も かかるから , 一度つくったソフトウェアは てきるだけ多くのコンヒ。ュータの上て共通 に使えるようにしたい。そうすると , OS と しては多機種に共通なもの , すなわち共通 プラットホームになるものが望ましくなる。 こういった願望を満たす OS として , 数年 , わが国て、も注目されるようになった ものが UNIX て、ある。 UNIX は事実上ほとん どすべての WS の標準 OS となっているか ら , WS をソフトウェア開発に使うというこ とは , UNIX を使って仕事を行うということ この UNIX にからんて忘れてならないの は , C 言語がもともとは UNIX を記述するた めに開発され , ついて C コンパイラ自体およ びソフトウェア開発のための各種ツールが C 言語によって書かれてきたという事実てあ る。 C 言語は今てこそパソコン用の MS ー DOS や一部の大型機やスーパーコンても使われ ているが , C にとって相性がもっともよいの は , 何といっても UNIX だということは否定 てきない。 C てソフトウェア開発をやるのな 大特集最新 UN Ⅸ考察 27

4. 月刊 C MAGAZINE 1990年2月号

をインタフェイスに使う必要があります。 ただし , 基本クラスの非公開メンバは , どちらの 形式て、派生しても , 派生クラスの外部に対してだけ てはなく , 派生クラスのメンバに対しても非公開に なります。つまり , 派生クラスのメンバて、あっても , 基本クラスの非公開メンバには , 基本クラスの非公 開メンバのインタフェイスが必要になります。これ は , 派生クラスを基本クラスのフレンドにすること て、 , インタフェイスなしのアクセスが可能になりま すが , クラスの階層構造が何層にもなると , フレン ドを使ったのて、は煩雑になります ( 注 6 ) 。 そのためにキーワード、、 protected 〃があります ( 注 7 ) 。 1 月号て、のクラスの定義の際のキーワード、、 protecte d" によって指定される保護部の保護メンバは , その クラスを基本クラスとする階層の下の派生クラスか らて、あれば , 基本クラスのメンバ関数のインタフェ イスなして、自由にアクセスて、きます。 Fig. 2 の例て、 は , bignum クラスの保護メンノヾには ( 注 8 ) , signed Bignum, fooBignum, barBignum などの階層の下 の派生クラスのメンバが自由にアクセスて、きます。 Fig. 1 のふたつの派生クラスと基本クラスの private ( 非公開 ) ,protected( 保護 ) , public ( 公開 ) の各メン バの取り扱いをわかりやすくまとめると Fig. 4 のよ うになります。 クラスの派生により関連づけられた複数のクラス 仮想関数 スの総称のことて、ある。 のものが格納される可能性があるため , それがどの の変数のもの以外にも ,bignum, floatBignum など プログラム実行時て、は , pbCOJ には , signedBignum の変数の型を予想することがて、きません。つまり , インタが基本クラスのものに代入される派生クラス の性質を失う危険性を含んて、います。処理系は , ポ ただし , このような取り扱いは , 派生クラス独自 り扱いを実現しています。 納が可能て、あり , 関数呼び出し時などの一括した取 Bignum, floatBignum など , 複数のクラス変数の格 bignum クラスのポインタの配列 bp は , signed new fIoatBignum()3 ユ 41592,); pbC2] = new bignumC1254567890 つ ; PbC1]= new signedBignum("—113344"); pbC0] = bignum * pb [ 5 ] : いてはコラム参照 ) 。 以下にその例を示します (new/delete 演算子につ によりまとめて扱うことがて、きます。 ポインタを , その基本クラスのポインタの配列など ( 注 9 ) 。これにより派生クラスは , すべて , その変数の は , bignum クラスのポインタ変数に代入がて、きます 生クラスて、ある signedBignum クラスのポインタ えば Bignum クラスて、考えると , bignum クラスの派 ら基本クラスのポインタへの変換が可能て、す。たと C 十十の型変換機能て、は , 派生クラスのポインタか り扱うことが可能て、す。 は , 基本クラスのポインタを使うことて、まとめて取 new/delete 演算子 以前は , 動的な記憶領域の確保 / 解放の役目は標準 ライプラリの malloc / free 関数に任されていた。 しかし , C 十十ではクラスの導入にしたがって , 新 たに new / delete 演算子が用意された。たとえば , 要 素数 size の char 型の配列の確保は , 以下のように記 述する。 〃 C では (char * )malloc(sizeof(char) * size); char* p =new char[size] 不要になった場合の解放は , 以下のとおりである。 〃 C では free(p); delete Csize] p; こでの , [size] の部分は要素数の指定である が , 基本データ型の場合は省略可能である。この場 合は , 以下の記述でも同様の処理がされる。 delete p; new/delete 演算子が malloc/free 関数と異なる のは , コンストラクタ / ディストラクタの呼び出しが される点である。 1 : bignum * pb =new bignum [size] , 3 : delete Csize] pb; たとえば , このような記述では , 1 行目で記憶領域 に確保と同時に bignum::bignum(void) が各要素こ とに計 size 回呼び出される。 new 演算子は配列の確保 の際に , クラスの引数なしのコンストラクタを呼び 出そうとする。したがって , new 演算子によって配列 を作成するクラスは , 引数なしのコンストラクタを もつか , まったくコンストラクタをもたないことが 条件となる。 3 行目では領域の解放と同時に bignum:fibignum ( void ) が呼び出される。クラス型の配列の解放には , その要素数を必ず与える必要があり , そうでなけれ ば最初の要素についてしかディストラクタが呼ばれ 単独の変数の領域の確保であれば , 引数が必要な コンストラクタしかなくてもかまわない。その場合 以下のように記述する。 bignum * bp =new bignum ( ' 125456789 つ ; これと同様にして , 静的に配置する配列の各要素 についてのコンストラクタの引数は以下のようにし て与えられる。 ド 9999999999 1 } ; bignum abC2] = ab[O] は bignum::bignum(char* ) が引数 999999999 9 ″で呼ばれ , abC1] は bignum::bignum(uint32) が引 数 1 で呼ばれる。 注 6 基本クラスの設計の際 に , すべての派生クラスの 名前を予想して , フレンド にするのは困難てある。 注 7 このキーワード、、 pr 0 t e c t e d 〃は A T & T release 1 . 1 から追加された ものて、あり , 以前は protect ed による保護メンバの機能 がないために苦労した。 注 8 実際は bignum クラス は保護メンバをもってない 注 9 この Bignum クラスは bignum, signedBignum, fIoatBignum などの bignum クラスが基本クラスてある クラス階層に含まれるクラ C + + プログラミング入門 95

5. 月刊 C MAGAZINE 1990年2月号

大特集の最新 U N Ⅸ考察 [ 表 1 ] 3 大 OS の比較 OS ・ 0 規格のネットワーク機能 などがある。 次に UN Ⅸの根本的な改良を目的として開 発を始めているのは , Sun マイクロシステム ズのビル・ジョイ ( バークレー版の開発者 ) のグループて、ある。筆者がビル・ジョイに 聞いたところによると , 彼の方針は次のと おりだという。 プロセッサ 互換性 ◎ マルチタスク ◎ マルチューザ ◎ ユーサー D / ノヾスワード Motif OPEN LOOK, Windows ウインドウ TCP 刀 P プロトコル 日 S ー 232C ネットワーク 日本語機能 ◎ △ 高価 / 少ない にれから ) 応用ソフト 安い / 多い ( 注 ) A 引はアプリケーションバイナリーインタフェイスの路。 . A 引の規約を守ったソフトウェアは同一プロセッサの異機種間で互換性 ① 0 からスタートして UNIX を全面的に がある。 ンジのコンヒ。ュータとしてオフィスプロセ ある。 書き直す。 ッサ ( オフコン ) が年に 16 万台も出荷されて ④応用ソフトウェアの充実 ②記述言語としては , C て、はなく , オプ GUI を意識した UNIX プログラムの開発に ジェクト指向の C 十十を使用する。 このため , 日本て、は , WS がなかなかビジ は , 各種ツールの充実と要員確保が必要て、 ③新 UNIX のカーネル ( メモリに常駐す ネス応用に使われず , WS は主とし EWS( 工 ある。 る各部分 ) はて、きるだけ小さくする。このた ンジニアリング (S) として使われている。 め , カーネルはビル・ジョイが 1 人て、 ( わざ WS の市場はまだきわめて狭いのて、ある。 WS と ) アセンプラ語を使って開発しているとい のハードウェアおよびソフトウェアを安く し , 豊富にするには , WS をビジネス ( 事務 ④新 UN ⅸて、は , 最初の設計のときか 処理 ) て、も使えるようにする必要がある。 UNIX はすて、にかなり普及した OS て、あ ら , ビットマップディスプレイ , 超大容量 の事情はパソコンて、も同じて、 , 年間 137 万台 る。したがって , これに根本的な変更を加 ディスクとデータベース , ネットワーク , のパソコンに対し , 日本語専用ワープロは えたり , UNIX にかわる OS をつくったりす マルチプロセッシング , 実時間制御 , 多国 255 万台も売れている。わが国て、はパソコン ることは今や非常に難しい。そこて、 , 現実 吾サポートなどの基本機能を盛り込む。 は日本語ワープロにくわれて , アメリカほ に行われているのは , UNIX を少し変史して どは売れていないのて、ある。 新しい機能を付加することて、ある。そうし こうした新 UNIX がはたして完成するか , た機能の例としては , いって、きるかなどはまだわからないが , ビ ・マルチプロセッサによる並行処理 上記のような問題点をかかえている UNIX ル・ジョイのことばによれば , "UNIX の次 をこれからわが国て、普及させるのは容易て、 〔例としては , NeXT にも採用されて はまた UNIX" ということなのて、ある。それ いる MACH がある〕 はない。 UNIX のシステムの数が増えない が本当かどうかはともかくとして , UNIX に ・実時間制御 ードウェアもソフトウェアも安くな かわる OS が今のところみえていないことは ・データベース管理 らないから , とにかく普及は重要て、ある。 たしかて、あろう。 そのためには , 業界て、は次のような工夫が Fig. 7 日本の特殊事情 ( 1988 年 ) 必要て、あろう。 ④ソフトウェアの販売体制 パソコンのプロセッサは 80286 および 80386 にほば標準化されていて , 応用ソフトはバ イナリレベル ( 機械語 ) て、互換性があるが , UNIX のプロセッサは 80386 , 68030 , SPARC, MIPS, M88000 , HPPA, i860 と多 種多様て、あり , ソースレベルて、しか互換性 がない。そこて、同じソフトを他機種向けに 配布するうまい方法を考える必要がある。 ⑥ UN Ⅸコンサルタントの増員 上記②などの面倒をみる人が大勢必要て U N Ⅸ 多種多様 MS-DOS 8086 OS / 2 80286 / 80386 ◎ 〇 PM ( 開発中 ) △ ( 機種ことに ABI) X の行方 1 三 ウーク ステー - ション ( 5 万台 ) 24 % 日本語 ワープロ ( 255 万台 ) 65 % ノヾソコン ( 137 万台 ) 35 % オフィス プロセッサ ( 16 万台 ) 各社独自 OS COBOL 76 % 大特集最新 UN Ⅸ考察 77

6. 月刊 C MAGAZINE 1990年2月号

がコール先関数のアドレスに書き換わり , これて、関数コールは完遂て、す。現在 , SP の 値はリターンアドレスがあるところの番地 になっています。 前回て、も触れましたが , 引数はスタック へのコピーとして渡されるのて、 , コールし た側にある引数に相当する変数など , その ものがコールされた側の関数の動作によっ て書き換えられたりすることは ( ポインタに よる直接参照のとき以外は ) ありません。 さて , C の関数は冒頭て、必ず , Fig. 4 のよ うな操作をしています。 Fig. 3 の , 関数コールの完遂時のスタック の姿は , SP がリターンアドレスを指してい て , 引数はそれ以降の番地に push されてい るのて、 , SP を頼りに a, b, c などの引数に アクセスて、きそうに思えます。 ところが SP の値は , さらにこの時点以降 のスタック操作 ( 例 : さらにほかの関数をコ ール ) によって , いくらて、も変わりえます。 したがって SP によっては , 恒常的な番地ア クセスが保証されません。 そこて、移ろいやすい SP そのものて、はなく て , 現時点の SP の値を ( 瞬間スナップ写真 的に ) BP にコヒ。ーしておき , BP を頼りに引 数にアクセスする , というのが C の関数て、は 必ず行われる方法て、す。 しかも , BP を使うといっても , コールし た側て、も BP を自分の目的 ( たぶん今回と同 じような目的 ) て、使っている可能性が大いに ありますから , 無造作には使えません。そ こて、 BP の現在値をまず push して , その ( コ ール側にとって必要かもしれない ) 値をスタ ックに保全するのて、す ( 後て、リターン直前に BP にその値を戻して (pop して ) やります ) 。 それから SP の現在値を BP にコピーしま す。上記の "push bp" が実行された時点 て、 , スタックの姿は Fig. 5 のようになりま す。したがって , 次の、、 mov bp, sp 〃て、 BP にコビーされる SP の現在値は , Fig. 5 の * て、 示した番地て、す。 Fig. 5 は , 個々のデータの幅がいずれも 16 ビット ( = 2 バイト ) て、すから , 関数に渡され た先頭の引数てある a の値には , [BP + 4] てアクセスて、きることになります。 すなわち [BP] にあるのは旧 BP の保全 値て、あり , [BP + 2 ] にあるのはリターンア C 言語フォーラム 117 sub sp, SP-2 → 現 BP → = 旧 SP 保存した BP return addr a の値 b の値 c の値 2 により local var 保存した BP retu 「 n addr a の値 b の値 c の値 ←コール側に とって大切 かもしれな い B P の値 ←ローカル変数 用スペース 個々はすべ ーて 1 6 ピット : ( = 2 ノヾイ ート ) ローカル変数を使用しない関数 funca proc push 爪 OV near bp bp, sp ・・・ BP レジスタの値をスタックにセープする ・・・ BP には SP の現在値をコピーする 16 ピット幅のローカル変数をひとつだけ使用する関数 funca proc push ITIOV sub near bp bp, SP sp, 2 BP レジスタの値をスタックにセープする ・・・ BP には SP の現在値をコピーする スタックをさらに 2 ノヾイト ( = 6 ピット分 ) 拡大する ドレスて、す。そして [ BP + 4 ] が引数 a の値 て、す。 そして , 関数が内部的に使うローカル変 数もスタック上のスペースを使いますから , 上記の、、 sub sp, 2 〃によってスタックの 姿は Fig. 6 のようになります。ローカル変数 には [ BP ー 2 ] , つまり BP からの負数のオフ セットて、アクセスて、きることがわかります。 というわけて、 , C の関数て、は引数やローカ ル変数へのアクセスに , もつばら BP レジス タを使うのて、す。 C の初心者は , 簡単なテス ト用プログラムを書き , それをアセンプリ ロ語のソースを出力するオプション ( TurboC なら -S オプション ) て、コンパイラにかけ , のことを確認してください ということは , C の関数の中て、 asm 文など を使ってレジスタを直接操作するとき , 関 数への引数やローカル変数への必要なアク セスがすべて終わった後て、しか , BP の値を ということを意味し いじってはいけない ます。しかも , ローカル変数確保などのた めに上記のように SP の値を書き換えた場 合 , sp の元の値 ( 関数冒頭の、 spush bp" の直後の、、 mov bp, sp クの時点における SP の値 ) を後て、回復するために , C の処理系は 必ず、、 mov sp, bp" という形て、 BP の値を 使います。だから BP の値をプログラマが勝 手に変える場合には , 前の値を保全 ( pus れ ) し回復 ( pop ) してやる必要があるのてす。 前回述べた私のドジ (DISK BIOS 関数の バグ ) は , このタブーを犯して , 関数の実行 の最初のほうて、 BP に引数の値のひとつを口 ードしてしまった ( = BP の値を変えてしま い , 引数やローカル変数に正しくアクセス て、きなくした ) からて、した。 次回も , 関数と引数の話をもう少し続け ようと思います。

7. 月刊 C MAGAZINE 1990年2月号

P O-C 統合環境 ・日本語 P 日 0 ー C は、 C のソースコー ドを自動生成し、アプリケーション プログラムの生産性向上を図る画期 的な開発支援ツールです。 ・メニュー対話方式で簡単に操作で き、 C 言語を意識することは全くあ りません。 ・マンマシンインタフェース部分を 画面上で自由にレイアウトできます。 ・ C 言語ての開発作業の生産性を驚 くほど高めます。 SUPER ー VERSION The C Source Code アプリケーション開発支援ツール 優れた操作性 メニューとの対話方式で、操作性は抜群です。しかも、 FI キーでオンライ ンのヘルプ画面が現れ、マニュアル片手の操作は一切不用てす。 Applications Generator. レコート定義モジュール レコートのレイアウトを決定します。 Bt 「 ieve とシーケンシャルファイル をサポートしています。出力される C のプロクラム中には、構造体として 取りこまれます。 プログラ ムの作成 スクリーンモジュール レポートモジュール ホップアップ画面の設定等、相互 タックシール印刷等、自由なフォ 参照されたファイルを画面上の任 ーマットの帳票が作成てきます。 意の場所に設定可能てす。 ( ホップ アップ画面では最大 23 レコードま で表示 ) アップテートモジュール メニューモシュール マルチファイル・アップテートプ サプメニュー等の設定も可能なメ ロクラムを作成します。月次処理 ニュープログラムを作成します。 等のプログラムに便利てす。 最適化・注釈文付の C 言語のソースプログラムを生成しま魂 日本語 P 日 0- C で生成されたソースコードは、日本語 P 日 0- C b 0 - W 独自の関数群を使用しています。それらの関数群 ( ワーク・べン cl 『 b0 - チ ) は、すべてソースコードで提供します。 。 , 、一。 0 。 0 画面上に - " ゥ→ドウを消去ます。 delete-w 導入効果 ・ C 言語が分からなくても操作可能です。 即戦力教育用 ・ C 言語のソースプログラムを出力します。 テ八ック不要プログラムの標準化 ・画面のレイアウト等が容易に設定てきます。 イメージどおりの実行結果メンテナンス時間削減 描き 尺を行 開発効率が大幅アツア 卓越した開発環境 ティレクトリの設定や色指定ができる環境設定。 作成したプログラムの仕様書を自動的に印刷する仕様書印刷機能。 作成したアプリケーションにもオンラインヘルプ機能を組みこむことができるヘルプ機能。 対象コンノヾイラ Mic 「 osoft C V5.1 対応機種 NEC PC ー 9800 シリーズ 必要ソフト MS-DOS V3.1 以上 及び機器構成八一ドティスク必須 ( 空き容量 6M バイト以上 ) メモリ 640KB 以上 Lattice C/DOS V4.1 TURBO C 2.0 日本語 P 日 0 ー C SIJPER VERSION 田 8.000 円 標準価格 ( 消費税は含んていません ) 日本語 P 日 0 ー C SUPE 日 VE 日 ON スクリーン・プロセッサー 30 , 000 円 日本語 P 日 0- C には、 J3100 、 FM 日など他機種対応版や、ノヾーソナル版「ヘルプ / C 」、 アドオンソフト「スクリーン・プロセッサなど豊富なファミリーかありま魂 日本語 P 日 O-CI トソナル版「ヘルア C 」応版特別価格 30 , 000 円のキャンペーン好評実施中。 ・日本語 PRO ー C で生成されたプログラムの再販に際しての RIJN 刊 ME フィーは一切必要ありません。・ MS ー DOS は、米国マイクロソフト社の登録商標です。その他記載の名称は、一般に商標です。 ・製品の仕様は予告なく変更する場合があります。 〒 150 東京都渋谷区渋谷 3-27-11 祐真ビル PC ソフトウェア販売部 お問い合わせは容 03-407-7481 ( 、 om 〃Ⅲど g 所′所 g & ( 、 0 レ / 行れ g

8. 月刊 C MAGAZINE 1990年2月号

Kernighan ふたつの言語には違いもある んて、す。たとえば , キーワードがそうて、す。 これは些細な例て、すが , 両者の違いを示し 10 CMAGAZINE 1990 2 ANSI が C をコントロールしているわけで 現在 ANSI C が標準となっています。 きたことの影響 C をコントロレして リッチーが す。 ければ , 1 日に 5000 行は翻訳て、きると思いま グラマならプログラムがそれほど膨大て、な たいへんて、はないと思います。優秀なプロ 田いますし , 手作業て、することもそれほど ころて、は , それほど難しいことて、はないと トラップに聞いてください。私が感じたと Kernighan それはビャーン・ストラウス るのですか。 C を自動的に C 十十に翻訳する方法はあ C て、は複数の名前空間から出てきます。 すべてひとつの名前空間に山来しますが , には違いがあります。 C 十十て、は , それらは て、すが ) 構造体タグと一般名のネーミング間 ます。たとえば , ( これは非常に専門的な話 と思います。また , 名前空間の間題もあり はタイプチェッキングを捨てることはない らいのうちにそうすべきて、す。しかし C 十十 を廃棄することがて、きますし , 今後 10 年く るかもしれません。 C はいくつかの占い特長 すから , どちらかの言語を変える必要があ す。そこがいっしょにて、きない点て、す。て、 ッキングが切れますが , C 十十て、は続きま な違いて、す。 C て、はこれによってタイプチェ 数がないことを意味します。 こが基本的 て、は , そのように宣言するということは引 ということもて、きるわけて、す。しかし C 十十 例て、すが , 引数として「何て、もかまわない」 せすに関数を宣言すれば , これは悪い使用 ています。 C の場合 , まあ引数リストを特定 す。しかしそれ以前は , 約 10 年間この世界 全体にわたって , デニス・リッチーが個人 的に c の構文と意味をコントロールしてきま した。これは私が知るかぎり , 前例のない ユニークなことです。ほかにこうしたケー スがあてはまる言語はないと思います。そ れはどのようなプラスおよびマイナスの影 響を C 言語に与えたのでしようか。 Kernighan あなたがいわれたことは基本 的にそのとおりだと思います。それは大方 , 非常にいいことだったと思います。ます , 先ほどもいいましたが , デニス・リッチー の言語感覚は非常に優れているからて、す。 彼には物事を正しく行うセンスがあります。 彼の行った言語の定義をユーザすべてが受 け入れたのは , デニス・リッチーがたいへ んな権威をもっているからて、はなく , 彼の 設計が非常に優れていたためにそれを変史 する理山がほとんどなかったからなんて、す。 だからこそ , それが事実上の標準になった のだと思います。ほとんど完璧に近かった のて、すから。リッチーが個人的に C をコント ロールしてきたということは , 本当に , 積 極的な意味て、非常によかったことなんて、す。 PCC の開発と その影響 「プログラミング言語 c 』という著書も そうした状況の永続化に一役買った・・ Kernighan あの本にはデニス・リッチー の業績が書き記されているようなものて、す / たしかにそうて、す。その本には , コンパイ ラを書く人にとっては不十分かもしれませ んが , ューザにとっては非常に正確に C の何 たるかが記されています。その後の展開を 見ると , C 言語が , とくに小型コンヒ。ュータ の世界において普及するにつれ , ますます 多くの人たちが C 向けのコンパイラを書くよ うになっています。 C には , もうひとつ PCC というバージョ ンがあります。それがどのように開発され , どのような効果をもたらしたのか話してい ただけますか。 昔からスチープ・ジョンソン Kernighan とは親しい友人て、すが , 私はそうした活動 には実際にかかわってきませんて、した。私 は PCC や PCC べースのコンパイラにはほと んど関係しませんて、したが , スチープ・ジ ことは非常に重要なことだ ョンソンがした ったと思います。なぜなら , 、、 P クは、、ポー タブル ( 移植性 ) 〃を意味しているからて、す。 つまり , この C コンパイラを取り上げてそれ をほかのマシンに移植て、きるということて、 す。スチープ・ジョンソン自身それをいく つかのマシンに行いました。しかし彼とデ ニス・リッチーは非常に緊密に努力をかさ ね , そこて、彼らは C 言語の定義に関してほと んどすべて合意に達したわけて、す。これは たいへん重要なことて、した。これらふたっ のバージョンにはほとんど違いがありませ ん。つまり , C 言語は普及したけれども , そ れは多くの異なったハードウェア環境にお いて基本的に同じ言語のままて、あったとい えるわけて、す。 少なくとも私の目からみれば , それが PCC の重要な点て、す。 PCC は C の普及に一役買っ たけれども , それを非常に統一された方法 て、渟及させたと。誰もが今て、も PCC を使用 していれば , おそらく ANSI 標準は必要ない といえるのて、はないて、しようか。しかし , それは非常に件い見方かもしれません。 の点に関してデニス・リッチーやスチープ・ ジョンソンに話しておいてください ℃にかかわる あらゆる衄に ーコロロ 取り組んだ」 デニス・リッチーとは話をしました。

9. 月刊 C MAGAZINE 1990年2月号

匚ーコ 五ロ 一三ロ はじめて学ぶプロクラミンク const て、は , 同じ定数て、も概念が違いますの て、 , しつかりと頭に入れておいてください stdlib. h をインクルードする必要がありま 注意してほしいのは , const を用いて定数を す。 したがって , 2 行目て、 , 言すると明確な型が指定できることてす。 つまり , #include く stdlib. h> としています。 exit 関数は , void 型て、 , プログラムを組む幹となるのが , この制 御文て、す。プログラムを制御するとは , 「プ exit( 整数 ) ; ログラムの流れ」を変えていくということて す。制御文なくしては , プログラムは書け とすることにより , すべてのファイルをク ローズしてシステムに整数 ( 工ラーコード ) ないのてす。 このことについては , 12 月号て詳しく書 を返します。 main 関数以外て、強制終了した きましたのて、 , そちらを参照してください い場合は , この exit 関数を使うのて、す。 21 , こて、は , 12 月号て、説明しきれなかったこ 26 , 29 行目て、 , との補充をします。 const unsigned long int MAX 4000000000 ; などという定数も宣言て、きます。したがっ て ,ANSI C のプログラムて、は , const を用い た定数を使うことをお勧めします。 const で宣言できない定数 こて、 , 定数 MAXNUM が const て、宣言さ れてないのはどうしてだろうと思った人が いると思います。これは , MAXNUM が配 continue 文 列の大きさの指定に用いられていることに となっています。これによって , プログラ よります。配列の大きさは , 必ず定数 ( 100 ムは強制的に終了し , システムに continue 文は , 繰り返しを制御する文 とか 1000 とか実際の数字 ) て、なければなりま 工ラーーコ (for 文 , while 文 , do-while 文 ) の複文の中 ードの 1 を返しています。また , 41 行目て せん o#define を用いて MAXNUM を定義す て、のみ使用て、きます。 continue 文は , その は , ると , プリプロセッサによってコンパイル ループの中の continue 文以下をスキップす する前に MAXNUM が数字 ( 100 という文字 るのて、す。 while 文を用いて書式を示すと , 列 ) に置き換えられています。この場合はな 以下のようになります。 んの問題もありません。しかし , const を用 として , プログラムが正常終了したという いて MAXNUM を宣言した場合 , コンパイ コードの 1 をシステムに返しています。 while ( 式 ) { ルするときにはまだ MAXNUM の値は不定 main 関数て、は , main 関数を int 型に宣言し 文① なのて、 , 「配列の大きさの指定には定数が必 return 文を用いてエラー処理をしてもいい 要て、す」というようなエラーが出てきてしま て、すし , 今のように main 関数を void 型に宣 continue うのて、す。このような場合は , 必ず #define 言し exit 関数を用いてエラー処理をしても 文② を用いてマクロて、定数を定義する必要があ いいて、す。みなさんの好きなほうて、やって ります。 #define と const は , 機能の違いを ください。ただし , main 関数以外て、は , exit 考えて使い分けてください 関数を使わなければなりません。 工ラ里の復習② #define と constm い List5 と List4 て、は , 工ラー処理の仕方が違 , こて、 , #define と const についてまとめ います。 List5 て、は , 6 行目て、 , ておきましよう o#define て、定義された定数 は , プリプロセッサて、処理されコンパイル void main( void ) する前に定義した値に「文字列処理によって」 置き換えられます。つまり , コンパイルす と , main 関数が , void 型て、宣言されていま るときには , すて、に数字に置き換わってい す。これは , 工ラー処理に exit 関数を用い ます。一方 , const て、宣言した定数は , コン ているのて、 main 関数自体は値を返さない パイラによって変数と同様に宣言されます。 とによります (List4 て、は , return 文を用い したがって , const て、宣言した定数は , 値を てエラー処理をしていたのて、 , 爪 ain 関数は 変えることのて、きない変数だと考えてさし int 型て宣言されていましたね ) 。 exit 関数 つかえありません。このように , #define と は , stdlib. h て、宣言されているのて、 , この exit( 1 ) ; exit( 0 ) ; Fig. 5 continue 文の制御構造 (while 文 , if 文とともに用いた場合 ) NO 式 1 が真 ? Yes 文①・・・ Yes 式 2 が真 ? NO はじめて茎 ; : C プログラミング 1

10. 月刊 C MAGAZINE 1990年2月号

MS-DOS プロクラミング 入門 第 5 回割り込みの概念と プロ フミング C プロクラマのための 秋津彰文 割り込み ( インタラブト ) は , MS - DOS でプログラミ ングする上で , もっとも重要な要素のひとつである。 ただし , アセンプラレベルの知識か要求され , C だけ で開発することか困難であった。しかし , 最近は C の処 理系か割り込み関係の関数をサポートするようになり , 以前よりは簡単にプログラムか組めるようになった。 チンの実行が終了すると , 当然割り込みを いるのは , 戻りの型だけて、ある。これは , かけた行の次に戻る。このとき , ハンドラ 8086 という CPU 自身が固有にもっている機 は IRET 命令て、戻る。この工 RET 命令は通常 能なのて、 , 無条件に従わねばならない C 言語からは , 処理することがて、きない。し 割り込みは C て、書くところのサプルーチン 8086 ファミリーて、は , アドレスの OH から たがって , 割り込みハンドラを C 言語て、書く に動きが似ているところがあるため同じも 400H まて、の 1024 バイトについて , OH のほ ときは , ひとくふうがいる。よく行われる のと誤解されやすいが , 決してそうて、はな うから連続した 4 バイトをひとっとしたメモ のは , 割り込みハンドラをアセンプラて、書 い。割り込みの基本機能は , 割り込みの発 リに番号を割り振り , 計 256 個の割り込みを き , 割り込みを行わせるプログラムのほう 生タイミングが予想て、きない点て、あろう。 固定的に割り当てている。この番号を割り込 を C 言語て、書くというスタイルて、ある。 もし割り込みが発生したら , その割り込み み番号と呼んており , プログラムの中て、割 ところが , 最近の C 言語て、は , 直接 C のソ がどのような作業を行うかはハンドラによ り込みをかけるときにはこの番号て、指定す ースプログラムから処理て、きるように inter って異なるが , アプリケーションからみる る。また , 0H から 400H まて、を一般に割り 「 upt 修飾子がサポートされている。この inter と , 予期て、きない事柄を割り込み作業に割 込みべクタテープルまたはインターラブト rupt 修飾子は TurboC と QuickC のバージョ り当てておけば , そのぶんの開発が楽にな べクタテープルと呼んて、いる。 ン 2.0 て、はサポートされているが , MS-C は る。いつ起こるかわからないことに神経を 割り込み番号が割り振られている 4 バイト TurboC ほど完全にはサポートされていな とがらせる必要はない。発生したときに対 のそれぞれには , 実際に処理を行うルーチ い。 TurboC には interrupt 修飾子のほかに 処て、きていればよいのて、ある。これが割り ンがあるメモリのセグメントとオフセット も割り込みに関するライプラリがそろって 込みの使い方のひとって、ある。事実 , フロ が格納されている。この 4 バイトのことを割 いるのて、 , アセンプラを使わすに TurboC だ ッヒ。ーが入っていないドライプに DIR のコマ り込みべクタアドレスと呼んて、いる。 けて、開発することがて、きる。 ンドを実行させると , 「中止く A 〉 , もう一度 実際に割り込みがかかると , べクタアド 割り込みのメリットは , システムの機能 く R 〉 , 無視く I> ? 」のメッセージが表示され レスて、指定されたアドレス , または故意に 向上にかなりの効果をもたらすことて、ある。 る。このメッセージは , 割り込み処理によ 書き換えたアドレスに命令が移動し , そこ つまり , 割り込み先のアドレス ( べクタアド って出力されているのて、ある。フロッピー に位置しているサプルーチンを実行する。 レス ) を自由に変えられることによる効果て、 にデータを読みにいくとき , フロッピーが このルーチンは一般に割り込みハンドラと ある。しかも , そのアドレス先のハンドラ 挿入されていなければ , 割り込みが発生す も呼ばれており , ューザが作成したルーチ はどのようにもつくることがて、きる。いい るようになっているのて、ある。 ンはユーザハンドラと呼ばれている。ルー かえれば , 割り込み操作て、唯一固定されて 今回は , べクタアドレスの変更とユーザ ・割り込みの基本と概要 86 CMAGAZINE 19 2