矢沢久雄 グレープシティ アドバイザリースタッフ

 皆さんが使っているパソコンには,WindowsなどのOSがインストールされています。OSもプログラムの一種であり,主プログラムと多数の副プログラムから構成されています。これらの副プログラムの中には,キーボードやディスプレイなどの周辺装置とデータの入出力を行う機能を提供するものがあり,それらを皆さんが作るプログラムから呼び出すことができます。OSが持つ副プログラムを呼び出すことを「スーパーバイザ・コール(またはシステム・コール)」と呼びます。今回は,スーパーバイザ・コールを使って,キーボードからデータを入力する方法と,ディスプレイにデータを表示する方法を紹介します。OSによって,I/Oというハードウエアを意識しないプログラミングができることに注目してください。ハードウエアを隠すことは,OSの役割の1つだからです。

●キーボードからの入力

 OSが持つ副プログラムの呼び出しは,CALL命令とRET命令で行われるのではありません。キーボードから入力を行うスーパーバイザ・コールのニーモニックは,IN(INput)です。INのオペランド(目的語)は2つあり,1つ目に入力データの格納領域のメモリー・アドレス(ラベル)を指定し,2つ目に入力された文字数の格納領域のメモリー・アドレス(ラベル)を指定します。プログラムのユーザーは,何文字入力するか分かりませんから,入力データの格納領域は,余裕を持った大きめサイズにしておかなければなりません。

 リスト1は,256文字分の入力データの格納領域のラベルをBUFFとし,入力された文字数の格納領域のラベルをLENとして,キーボードから入力を行うプログラムです。入力されたデータをどう処理するかは省略しています。DS(Define Storage)命令は,メモリー領域を確保します。DSのオペランドには,確保するメモリー領域のサイズを指定します。メモリー領域1個で1文字を格納できます。

リスト1●IN命令の使い方

 IN  BUFF,LEN  ;スーパーバイザ・コール 
   :     
 BUFF  DS  256  ;入力データの格納領域を確保しておく 
 LEN  DS  1  ;入力された文字数の格納領域を確保しておく 

図1●メモリー・アドレスを知らせてデータを格納してもらう
 IN BUFF,LEN実行時のイメージを図1[拡大表示]に示します。BUFFとLENは,どちらも前回の連載で説明した参照渡しです。OSが持つ副プログラムに,皆さんが作ったプログラムのデータ領域のメモリー・アドレスを知らせて,文字列と文字数を格納してもらうのです。

●ディスプレイへの出力

 ディスプレイへの出力を行うスーパーバイザ・コールのニーモニックは,OUT(OUTput)です。OUTの使い方は,INによく似ています。OUTのオペランドも2つあり,1つ目に出力データの格納領域のメモリー・アドレス(ラベル)を指定し,2つ目に出力する文字数の格納領域のメモリー・アドレス(ラベル)を指定します。

 リスト2は,256文字分の出力データの格納領域のラベルをBUFFとし,出力する文字数の格納領域のラベルをLENとしてディスプレイへ出力を行うプログラムです。

リスト2●OUT命令の使い方

 OUT  BUFF,LEN  ;スーパーバイザ・コール 
   :     
 BUFF  DS  256  ;出力データの格納領域を確保しておく 
 LEN  DS  1  ;出力する文字数の格納領域を確保しておく 

図2●メモリー・アドレスを知らせてデータを表示してもらう
 OUT BUFF,LEN実行時のイメージを図2[拡大表示]に示します。BUFFとLENも参照渡しです。OSが持つ副プログラムに,皆さんが作ったプログラムのデータ領域のメモリー・アドレスを知らせて,文字列を必要な長さだけ表示してもらうのです。

 リスト3は,IN命令とOUT命令を組み合せたサンプル・プログラムです。キーボードから入力された文字列を,そのままディスプレイに表示します。意味のないプログラムのように思われるかもしれませんが,皆さんが実際のコンピュータでキーボードから入力を行っている時も,IN命令とOUT命令に相当するスーパーバイザ・コールが呼び出されているのです。IN命令だけでは,入力された文字がディスプレイに表示されません。

リスト3●キーボード入力をディスプレイに表示する

 IN  BUFF,LEN  ;スーパーバイザ・コール 
 OUT  BUFF,LEN  ;スーパーバイザ・コール 
   :     
 BUFF  DS  256  ;入出力データの格納領域を確保しておく 
 LEN  DS  1  ;入出力する文字数の格納領域を確保しておく 

 もしもスーパーバイザ・コールが使えないとしたら,どうやって周辺装置と入出力を行えばよいのでしょう?本物のCPUには,OSを仲介させずに直接I/Oと入出力を行うための命令や,I/Oからの割り込み(I/Oから皆さんのプログラムの中にある副プログラムを呼び出すこと)を受け付ける機能が装備されています。ただし,これらを使いこなすには,ハードウエアに関する高度な知識が必要となります。難しいことを考えずに周辺装置との入出力を可能にしてくれるスーパーバイザ・コールとは,実に便利なものです。そしてこのスーパーバイザ・コールを提供してくれるOSは,実にありがたいものなのです。

 次回(最終回)は,アセンブラでソートやサーチを行う高度なプログラムを紹介します。どうぞお楽しみに!