アセンブリ言語レベルのプログラ ミ ングのための 委文イ直き寅算

NDC 548.2
アセンブリ言語レベルのプログラミングのための
数値演算プロセッサ用ユーティリティの作成
正*
岡 田
魚 田 祐 治**
(平成元年8月30日受付〉
Development of the Utility to support the Assembly−
Level Programrning of Numeric Data Processor
Tadashi OKADA* and Yuuji UOTA* *
(Received August 30, 1989)
The numeric data processor 8087 is widely used for high−performance numeric applications in synchronization with
the皿icroprocessor 8086. To support the assembly programming of 8087, we develop a utility progra皿expanding an
algebraic expression in an equivalent list of mnemonic codes of 8087. The outline, the application to a graphics and the
usefulness of the utility are reported and discuseed briefly,
る1)。8087を導入すれば,数年前のミニコン以上の数値演
1vはじめに
算処理能力を,パソコンで簡単に実現できる。8087を利用
パーソナルコンピュータ(パソコン)の普及と性能向上
するためには,8087をサポートしている高水準言語を使っ
によって,文字どおり個人レベルで手軽にコンピュータ資
たり,アセンブリ言語で組まれたパッケージ化されたライ
源が利用できるようになっている。文書処理に代表される
ブラリを利用するのが簡単である。しかし,8087の持つ能
OA(Office Auto皿ation)的な応用から,実験室内の自動
力を十分に引き出すために,お仕着せのソフトウェアでな
計測・制御のようなしA(Laboratory Automation)的な利
く,処理式に応じた適切なプログラム開発をしなければな
用まで,パソコンは幅広い用途で使用されている。
らない場合も多い。
パソコンを使った種々の処理は,手元で作業できるため
本稿は,NDP8087用のアセンブリ言語レベルのプログラ
ターンアラウンドタイムを短くできるという利点がある。
ム開発を行う際に,代数式を解析し8087用のニーモニック
しかし現状では,ミニコンピュータ(ミニコン)以上のコ.
列を生成するユーティリティについて述べたものである。
ンピュータに比べて,基本的な処理能力が劣るのも事実で
このユーティリティを使うことで,逆ポーランド記法によ
ある。とりわけ,理工学分野で重要な数値演算処理に関し
る表現が必要で,わかりにくい8087のプログラミングを,
て,能力不足に直面することが多い。
余分な知識が必要なく簡単に行うことができるようになっ
パソコンの数値演算処理の能力不足を補うために,たと
た。以下,NDP8087の概要,ユーティリティの概要,その
えアセンブリ言語レベルであっても,ソフトウェア処理に
応用と課題について報告する。
.
頼っていたのでは十分でない。そこで,ハードウェアで処
理できるよう,数値処理専用LSIが開発され種々の数値演
算プロセッサNDP(Numeric Data Processor)が利用でき
2.NDP8087の概要
数値演算処理を,現在のパソコンに搭載されたマイクロ
るようになっている。
プロセッサ(MPU)だけを使って行ったのでは,速度や
パソコン用マイクロプロセッサとして最も普及している
精度の点で満足できない場合が多い。そこで,数値演算専
8086には,コプロセッサとして動作するNDPの8087があ
用のLSIであるNDPを開発し, MPUの不足した機能を補
うことがなされている。
* 情報工学科
MPUと組み合わせて使用するNDPには,1/Oデバイス
**電気工学科昭和63年度卒業生,現在日本電気㈱勤務
としてシス.テムバスに接続するタイプと,MPUと密接に
一81一
津山高専紀要 第27号 (1989)
連携して動作するコプロセッサタイプがある。前者は,ど
にニーモニック列を生成するユーティリティプログラムの
のようなMPUにも接続できるという利点がある反面,
作成を考えた。次に,3.で8087プログラミングの特徴と,
データ転送や演算制御の命令を与えなければならず実行速
このマクロ展開ユーティリティの概要を述べる。
度の低下を招き,また1/0アドレスの違いなどからソフ
トウェアを標準化しにくいという欠点がある。これに対し
3.マクロ展開ユーティリティの概要
てコプロセッサタイプのNDPは,特定のMPU専用で他
NDP8087は,ロード/ストア・四則演算・関数演算:・比
のMPUのもとでは使えない。しかし, MPU自体が標準
較などの,数値演算処理に必要な命令が備わっている。こ
化されてきたので,この点の問題は少なくなっている。そ
れらの命令は,スタジクタイプの演算レジスタを使って行
れよりも,MPUに演算命令が追加されたように扱え,処
われる。すなわち,8087で命令を書くためには,数式を後
理速度も無1駄がなく支援ソフトウェアの標準化も容易に行
置記法(逆ポーランド記法)で表現しておくとよい。通常
えるという利点の方が大きい。
使われるFig.1(a)の中置記法(ポーランド記法)を,逆ポー
本稿で取り上げるNDP8087ユ)は,16ビットMPUとして
ランド記法に直すとFig.1(b)のようになる。逆ポーラン
最も広く使われている8086の機能を拡張し,数値演算処
ド記法による表現と,Fig.1(c)に例を示した8087のニーモ
理を行わせるために作られたコプロセッサである。8087は
ニック表現とは,よく対応していることがわかる。
MPUと並行して命令フェッチを行ないながら,専用命令
を独立して実行できるようになっている。このため,NDP
fld a
用に定義された命令を,通常のMPU命令と混在して置け
fld b
るので,8086用アセンブラでも8087専用ニーモニックが使
e=(a十b)/(c十d)
えるようになっているし,コンパイラ等でも簡単に支援可
能である。このような機能は,8087を専用線でMPUとつ
faddp st(1), st
fld c
(a) Polish notation
fld d
なぐことで実現してお.り,さらに,メモリと直接データ転
faddp st(1), st
送できるようなDMA機能も備えている。
fdivp st(1), st
8087内部には,80ビットの演算:レジスタが8本と,NDP
ab十cd十/e==
fstp e
の種々の処理を規定する環境レジスタがある。利用者から
は,MPUにこれらの資源が加わったようにみえる。8087
(b) Reverse polish notation (c) Assembly program of 8087
で処理できる数値は,IEEEの浮動小数点演算規格に準拠
している。上記の80ビット演算レジスタは,IEEEの拡張
Fig.1 Two notations and the assembly progra皿of an
algebraic expression
倍精度フォーマットを満たすものである。8087内部では,
数値はすべて拡張倍精度フォーマットで処理されるが,メ
モリ上では7種類のデータフォーマット(16/32/64ビッ
8087のアセンブリ言語レベルのプログラミングは,通常
トi整数・10進整数・32/64ビット2進浮動小数点など)を
使われている数式を逆ポーランド記法に変換し,次いで
扱える。従って8087では,±3.36×10−4932∼±1.19×
ニーモ屯ック列になおすと簡単に行える。しかし,スタッ
10+4932の広範囲の,10進数で約19桁の高精度の数値を基
ク処理に基づいた逆ポーランド記法は,特に初心者にわか
本にして処理する。演算処理は,10MHzのクロックで約
りにくく,簡単な利用を妨げる原因になっている。その一
8∼20μs(四則演算:の場合)の速度で実行され,パソコ
方,このような一連の規則正しい手順は,コンピュータ処
ン上で非常に優れた数値演算処理機能を実現できることに
理にのりやすいものである。そこで,ポーランド記法で表
なる。NDPを使って浮動小数点演算を行わせた場合,ソ
現された数式を解析し,8087のニーモニック列に変換する
フトウェア処理の数十倍から百倍以上の速度が得られると
「マクロ展開ユーティリティ」を作成することにした。
いわれている2)。
今回製作したマクロ展開ユーティリティを使えば,アセ
しかし,8087の機能を十分に引き出すためには,適当な
ンブリプログラム中に数式を埋め込んでおくだけで,自動
命令を8086の命令の中に組み込んで行かなければならな
的に8087のプログラムを生成してくれる。これによって,
い。8087の命令を扱えるコンパイラ等を使用することが
少ないキー入力でプログラムが書け,ソースプログラムが
手つとり早いが,間接的な処理で最適化が難しいし,アセ
短くてすみ視認性が増すので,開発時の効率が上がり保守
ンブリ言語レベルで扱わなければならない応用も多い。そ
も容易になるという効果が期待できる。しかし,.始めから
こで,初心者でも容易に8087を扱えるようにするために,
アセンブリ言語で記述した場合に比べて,オブジェクト
ソースプログラムとしては数式を入力するだけで,自動的
コードが増加し,従って実行時間の長くなるという欠点が
一 82
アセンブリ言語レベルのプログラミングのための数値演算プロセッサ用ユーティリティの作成 岡田・魚田
予想される。これらの欠点がどの程度かについては,実際
(例)FPOP A
の応用例を述べる4.で具体的に検討する。
次に,製作したマクロ展開ユーティリティの効果を確認
するために,フラクタル図形4)の一種であるマンデルブ
マクロ展開ユーティリティは,マクロアセンブラでマク
ロ展開できる命令の増加したように使用できるように,2
ローグラフィックスを;パソコンPC−9801VM2(MPUは
パス方式で,まずラベルテーブルを作成し,次いで式の展
開を行うようになっている。この中で,数式を解析し展開
8086と互換性のある日本電気製のV30で,10MHzのクロッ
クで動作)上で実行させた。具体的には,3.で述べた実
する部分が本ユーティリティの中心であるので,まずこれ
行時間の低下の程度を評価することを目的に,マンデルブ
を説明する。
ローのμ地図5)と呼ばれている図形を描かした。
一般に数式は,定数・変数・演算変数・関数(代表して
マンデルブローのμ地図図形は,複素関数
定変数と呼ぶ)と,定変数の乗除算の集合(準素と呼ぶ),
f(z) := z2一#
定変数と銃戦の加減算(因子と呼ぶ)に分けることができ
に適当な初期値を与え,計算結果を同じ式に代入すること
る。逆ポーランド記法に従って数式を展開するということ
で無限回同じ計算を繰り返し,そのときの発散を調べるこ
は,まず準素を探し展開してから,因子を展開することで,
とで描くことができる。このように簡単な四則演算の式を
単一の演算変数に分けることである。なお,関数の引数は
扱うだけであるが,繰り返し回数が多くNDP8087を使わ
一般に因子であるので,因子を演算変数に展開してから関
なければ,今回使用したパソコンでは実用上実行できない
数操作を施せばよい。すなわち本ユーティリティは,数式
計算量になり,マクロ展開ユーティリティの評価にふさわ
を読み込んで上記の手順に従って解析し,8087の地心モ
しいものと考えた。
ニック列を生成している。なお今回は,アルゴリズムの簡
マンデルブロー図形を描くアセンブリプログラムは,マ
単化のために,変数や定数が現われるとかならずプッシュ
クロ展開ユーティリティを使うことを前提にして,約1.9
するようにした。
Kバイトのソースプログラムとなった。これを展開すると,
上記の数式展開以外に,メモリへの変数の格納,変数へ
16%ソースコードが増加したので,逆に見ればそれだけ
の定数の割り当て,レジスタ変数の定義と解除の,実際に
キー入力が少なくてすみ,視認性も増したことになる。
演算を行うために必要になる機能も持たせてある。また,
続いて実行速度を,計算回数と大きさの制限を8種類変
8087が直接扱っていない関数として,絶対値・平方根・整
えて測定した。1画面の計算時間として,2時間弱から5
数・正接・指数・階乗を準備した。
時間強までが得られた。どの実行時間についても,始めか
マクロ展開ユーe一ティリティは,C言語(Lattice C Com−
らアセンブリ言語で最適化を心がけて書いたプログラムに
piler Ver. 43))で書かれている。数式展開部分を中心に,
対して,マクロ展開ユーティリティを使ったプログラムの
ラベルテーブルの作成や変換結果の書き出しなど,最新の
方が,1.07倍と7%の速度低下を招いた。この原因は,3.
バージョンで,約1400行,31Kバイトのソースプログラム
で述べたように,変数や定数が現れると必ずプッシュする
となった。
ようにしたためであろう。しかし,7%程度の速度低下で
あれば実用上問題ない範囲にあり,プッシュ回数を減らす
4.マクロ展開ユーティリティの応用と課題
ために,これ以上複雑なアルゴリズムを考える必要はない
マクロ展開ユーティリティを使って8087のアセンブリプ
ものと判断している。
ログラムを作成するには,数式を処理する必要のある場所
本マクロ展開ユーティリティの今後に残された課題とし
で次の命令を組み込めばよい。
ては,関数のサポートを充実させることがある。8087のサ
・CALC 演算を行う。
ポートしている関数は5種類と少ない上に,一般に使用さ
(1列)CALC (A十B)/ (C十D)
れている形式と異なるために,必ずプログラムを組まなけ
・STORE メモリにストアする。
ればならな.い関数が多い。これらの機能をマクロ展開ユー
(例)STORE A
ティリティに追加することは容易であり,今後これを実現
・STOREP メモリにストア後ポップする。
したい。
(例)STOREP A
5.あ と が き
・ASSIGN 変数に定数を割り当てる。
(例)ASSIGN A,0
本稿は,パソコンしで数値演算処理機能を飛躍的に増加
・FPUSH レジスタ変数を定義する。
させることのできる数値演算プロセッサ8087の,アセンブ
(例)FPUSH A
リ言語レベルのプログラミングを支援するための,マクロ
・FPOP レジスタ変数を解除する。
展開ユーティリティの概要について述べた。本ユーティリ
一83一
津山高専紀要 第27号 (1989)
文
ティをマンデルブローグラフィックスに応用することで,
献
その効果を確めた。その結果,視認性の高いソースコード
を作れる上に,キー入力量を16%低下させることができた。
1)インテルジャパン:iAPX86ファミリ・ユーザーズマ
実行速度が7%低下するものの,十分実用になるマクロ展
ニュアル(1981−8).
開ユーティリティが得られた。
2)大貫:数値演算入門,CQ出版(昭63)311.
ここでは,MPU8086と組み合わせるNDP8087について
3)Lattice, Inc,・ライフボート:Lattice C COMPILER
だけ述べたが,86系MPUを搭:載したパソコンのMPUは,
VER. 4 Reference Manual (1988−7).
80286から80386へと展開している。これらに適合する
4)高安;フラクタル,朝倉書店(1986>.
NDPも,80287から80387へと進んでいる。しかし,基本
5)高橋:Oh!PC,5−16(1987−4)267.
的な機能は変わっておらず,アセンブリ言語レベルでの互
換性は保たれている。従って,本ユーティリティも,軽微
な修正で新しいNDPに使用できよう。
一84一