ぐだぐだ低レベルプログラミング(221)x86(16bit)、浮動小数点数の例外処理

8086_8087_connectionEXCEPT
Joseph Halfmoon

このところ8087浮動小数点コープロセッサの「メンドイ」話が続いてます。前回は丸めとか無限大の制御とかメンドイ奴らの説明で終わってました。今回は、ラスボス?例外の登場です。例外そのものもいろいろな種類があってメンドイのですが、それ以前に、例外がCPUの8086へと伝わる経路もまたメンドイです。8087は自立してるし。

“ぐだぐだ低レベルプログラミング(221)x86(16bit)、浮動小数点数の例外処理” の続きを読む

ぐだぐだ低レベルプログラミング(220)x86(16bit)、浮動小数点数の丸めと制御

8087CW
Joseph Halfmoon

前回は、非正規数(デノーマル)とか疑似無限大とか「ヤバイ奴ら」の説明で力尽きてしまいました。しかし説明書きながらも「座りの悪さ」を感じていたのです。そういえば、メンドイ奴ら、丸めと計算精度の制御とか、無限大の計算モードとかやってなかったじゃないかと。8087の制御ワードの説明がいるな。それには8087の内部型も要説明。

“ぐだぐだ低レベルプログラミング(220)x86(16bit)、浮動小数点数の丸めと制御” の続きを読む

ぐだぐだ低レベルプログラミング(219)x86(16bit)、浮動小数点数の検査 FXAM

Joseph Halfmoon

前回は、8087のスタック・トップが正か負かゼロか、それとも比較しちゃヤバイやつなのかを判定するFTST命令を練習しました。しかし8087にはもっと細かくスタック・トップの素性を検査してくれる命令FXAMあり。しかし、これを理解するにはNaNだけでなく、非正規数とか無限大とか、疑似ナンタラとかヤバイ奴らが目白押しっす。 “ぐだぐだ低レベルプログラミング(219)x86(16bit)、浮動小数点数の検査 FXAM” の続きを読む

ぐだぐだ低レベルプログラミング(218)x86(16bit)、浮動小数点数のテスト

FTST_NaN_EC
Joseph Halfmoon

前回は8087での浮動小数点数の比較結果を8086のフラグに反映させて分岐する練習でした。今回は比較でなくテストです。8087のレジスタスタックのトップに置かれている浮動小数値が、正なの負なのゼロなの?と調べる命令。でもメンドクセーことに「比較不能」という分類もこれあり。浮動小数だもんね。ようやくNaN登場。
“ぐだぐだ低レベルプログラミング(218)x86(16bit)、浮動小数点数のテスト” の続きを読む

ぐだぐだ低レベルプログラミング(217)x86(16bit)、浮動小数点数の比較と判断

unasmFCOM_EC
Joseph Halfmoon

前回で8087の加減乗除は極めてしまったかと思いましたが早とちりデス。計算したら、計算結果を判断するという過程が必要。当然、8087には8087の比較命令というものが存在するのですが、8086側が司っているプログラム・フローに反映するのはどしたら良いの?ここで古代の遺物と蔑まれていた命令が活躍。ホントか?

“ぐだぐだ低レベルプログラミング(217)x86(16bit)、浮動小数点数の比較と判断” の続きを読む

ぐだぐだ低レベルプログラミング(216)x86(16bit)、浮動小数点数の加減乗除

FSUBba
Joseph Halfmoon

前回は8087の浮動小数加算命令を練習、これで加減乗除はバッチリかと思えば、「演算順序」の問題もあり。某国の小学校のようにスカラーの乗算に順序を求めることは流石にないです。減算、除算のときだけです。オペランドの表記法のルールと相まって慣れないとハマります。それもこれもスタック・アーキテクチャのせい?知らんけど。

“ぐだぐだ低レベルプログラミング(216)x86(16bit)、浮動小数点数の加減乗除” の続きを読む

ぐだぐだ低レベルプログラミング(215)x86(16bit)、浮動小数点数の加算

FADD_uEC
Joseph Halfmoon

前回は8087に浮動小数値をロード。その度にレジスタ・スタックは積みあがっていきます。今回は、浮動小数の加算。演算結果はスタックトップに書きこむのですが、スタックトップ位置はそのままの場合と、ポップして1個少なくなる場合あり。それに忘れちゃいけないx86はCISCデス。FADDでメモリを参照することも可。 “ぐだぐだ低レベルプログラミング(215)x86(16bit)、浮動小数点数の加算” の続きを読む

ぐだぐだ低レベルプログラミング(214)x86(16bit)、浮動小数点数のロード

unassemFLD_EC
Joseph Halfmoon

前回前々回と浮動小数点「コープロセッサ」8087の復習を行いました。ようやく8087命令をエクササイズする準備が出来たというところです。今回は、最初の一歩というところで、8087のレジスタ・スタックに浮動小数点数をロードしてみます。メモリから、そして沢山ある定数のロード命令を使ってみます。スタックに積まれていくのよ。

“ぐだぐだ低レベルプログラミング(214)x86(16bit)、浮動小数点数のロード” の続きを読む

ぐだぐだ低レベルプログラミング(213)x86(16bit)、8087のレジスタ

8087registers
Joseph Halfmoon

前回、8087数値演算コープロセッサの実行制御などハード的な部分を復習しました。何年、いや何十年ぶりだ?いよいよ浮動小数点演算命令の演習に突入?かと思われましたが、まだ復習必要っす。8087のレジスタです。こいつがまたメンドクセー奴。浮動小数点数のルールの数々、お惚け老人は覚えきれませぬが、知らないと命令動かせませぬ。
“ぐだぐだ低レベルプログラミング(213)x86(16bit)、8087のレジスタ” の続きを読む

ぐだぐだ低レベルプログラミング(212)x86(16bit)、WAITとESCAPE命令

8086_8087_connection
Joseph Halfmoon

前回までに8086/8088命令はほぼ舐め終わりデス。残るはWAIT命令とESC命令群です。ただし、WAIT命令を使うには「数値演算コープロセッサ」8087に登場していただかねばなりません。そしてESC命令には8087の命令が詰まってますが、8086/8088も遊んでいるわけではありませぬ。 “ぐだぐだ低レベルプログラミング(212)x86(16bit)、WAITとESCAPE命令” の続きを読む

ぐだぐだ低レベルプログラミング(211)x86(16bit)、HLT命令

Joseph Halfmoon

今回もエミュレータ上では動作確認がとってもしずらい命令です。HLTとな。マニュアルをみれば「CPUをHalt stateに入れる命令」ということですが、そもそもHalt stateって何?って話です。まあ、アプリコードを書くのに専念しているよゐこには縁がない命令かも。まあ、知らなくても実害はない?どうなんだ?

“ぐだぐだ低レベルプログラミング(211)x86(16bit)、HLT命令” の続きを読む

ぐだぐだ低レベルプログラミング(210)x86(16bit)、LOCKプリフィクス

busLOCK_EC
Joseph Halfmoon

遥か半世紀を遡る8088/8086の時代からx86はマルチプロセッサに対応しとります。そのお印がLOCKプリフィックスです。LOCK自体はエミュレータ上でも使い放題ですが意味なし。その動作をシミジミ味わうには、マルチ・プロセッサに対応したインテル・マルチバスシステムなどが必要。そんなもの無いぞなもし。 “ぐだぐだ低レベルプログラミング(210)x86(16bit)、LOCKプリフィクス” の続きを読む

ぐだぐだ低レベルプログラミング(209)x86(16bit)、INTOとINT

unassemHANDLER
Joseph Halfmoon

いよいよファーストバイト・オペコードマップの塗りつぶしも佳境。今回はソフトウエア割り込み命令、INTとINTOを練習してみます。といってINT命令の方はDOSのシステムコールで毎度お馴染み。いつも割り込みを操作するときは緊張して夜しか眠れないのだけれども、今回はお気楽。エミュレータ(QEMU)上での作業だし。

“ぐだぐだ低レベルプログラミング(209)x86(16bit)、INTOとINT” の続きを読む

ぐだぐだ低レベルプログラミング(208)x86(16bit)、LODSとSTOS

LODS_STOS
Joseph Halfmoon

前回はストリング命令SCASとCMPSを練習しました。どちらもREPプリフィックスでCX回繰り返し、途中ゼロフラグで継続か中断する判断するのに向いてます。しかしストリング命令と括られる中にはREPプリフィックスと「相性」の良くない命令があります。LODSとSTOSです。でもこいつら意外と便利なんだ、ホントか?

“ぐだぐだ低レベルプログラミング(208)x86(16bit)、LODSとSTOS” の続きを読む