ぐだぐだ低レベルプログラミング(239)x86(16bit)、286プロテクトモード

286protectmode_memory_access
Joseph Halfmoon

前回まで8086になく80186/80286で拡張されている命令の練習を実施。カテゴリの残りまだあるのですが、INS、OUTSは練習するのがメンドイです。一方他は8086でもあった命令にオペランドを追加したものどもで花がないっす。そこで今回から80286にて「追加されたもの」プロテクト・モードへ入りたいと思います。
“ぐだぐだ低レベルプログラミング(239)x86(16bit)、286プロテクトモード” の続きを読む

ぐだぐだ低レベルプログラミング(238)x86(16bit)、PUSHA、POPA

pusha_popa_diagram
Joseph Halfmoon

今回は、8086になく80186/80286で拡張されている命令の練習その3ということでPUSHA、POPA命令です。汎用レジスタマシンと言うにはレジスタ型付けが強いx86の全「汎用レジスタ」を一気にPUSH/POPする命令デス。でもスタックポインタ(SP)もPUSH/POPの対象に見えるのよ。大丈夫なのか?

“ぐだぐだ低レベルプログラミング(238)x86(16bit)、PUSHA、POPA” の続きを読む

ぐだぐだ低レベルプログラミング(237)x86(16bit)、BOUND、添え字のチェック

unasmMAIN
Joseph Halfmoon

前回、x86(16bit)範疇にはまだまだ命令があることに気づきました。お尻が長いよ。今回は、8086になく80186/80286で拡張されている命令のその2(遥か昔にENTER/LEAVEはやったので)ということでBOUND命令を練習してみます。使うか使わないかはあなた次第?コンパイラによっては余計なお世話か? “ぐだぐだ低レベルプログラミング(237)x86(16bit)、BOUND、添え字のチェック” の続きを読む

ぐだぐだ低レベルプログラミング(236)x86(16bit)、80186/80286追加命令

Joseph Halfmoon

長らく8087FPUの命令の練習を続けてきましたが、前回にて一応の完了といたしたいと思います(本人まだやる気ですが別シリーズ化の予定。)今回から32ビット、とも思いましたが、x86(16bit)範疇にはまだまだ命令が存在します。80186と80286で追加された命令どもです。なかなか32ビットモードに入れんぞなもし。 “ぐだぐだ低レベルプログラミング(236)x86(16bit)、80186/80286追加命令” の続きを読む

ぐだぐだ低レベルプログラミング(235)x86(16bit)、FSAVE、全レジスタセーブ

fsaveBeforeAfter
Joseph Halfmoon

8087FPUの制御命令の説明に前回前々回と2回を費やしました。今回こそ命令を「動かしたい」と思います。しかし、その前に確認しておかないとならないんだな、16ビット実行環境であるFreeDOSから「みえる」FPUの命令がどのレベルのものなのか?「ピュアな」8087ではないけれども、雰囲気は出してる?なんだそれ。

“ぐだぐだ低レベルプログラミング(235)x86(16bit)、FSAVE、全レジスタセーブ” の続きを読む

ぐだぐだ低レベルプログラミング(234)x86(16bit)、続、FPU制御命令

Joseph Halfmoon

前回、8087数値演算コープロセッサの制御命令の一覧を掲げました。全部を一気に説明するつもりが、ほんの一部の命令を説明したところで力尽きてました。今回は残りの制御命令を端から見ていきたいと思います。ううむ、アセンブラの実習はまたまた次回に見送りだな。なかなか「低レベル」練習に戻れませぬ。
“ぐだぐだ低レベルプログラミング(234)x86(16bit)、続、FPU制御命令” の続きを読む

ぐだぐだ低レベルプログラミング(233)x86(16bit)、FPU制御命令

FPU_Exception_Pointers
Joseph Halfmoon

前回は8087ストア命令を練習。いつものように命令セットに非対称性がありました。しかし今回のあれやこれやに比べたらまだましだったかもしれません。今回はずっと顔を背けてきた(その割に使ってしまった過去回もあるけど)FPUの制御命令を一挙に列挙してみたいと思います。今回は強烈なメンバどもを拝観するだけ、練習はまた今度。

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

ぐだぐだ低レベルプログラミング(232)x86(16bit)、FST、ストアあれこれ

unassemFSTEC
Joseph Halfmoon

前回は8087のpacked な BCD 整数のロード、ストア命令がなんで18桁なのか年甲斐もなく悩んでみました。今回はフツーの浮動小数とフツーの整数(2の補数)のストア命令を練習してみます。そんなの簡単じゃん、といいつつ、そこはx86一族です。ここにも命令セットの非対称性あり。いつものコマケー話なんだが。
“ぐだぐだ低レベルプログラミング(232)x86(16bit)、FST、ストアあれこれ” の続きを読む

ぐだぐだ低レベルプログラミング(231)x86(16bit)、BCD整数のロード、セーブ

unasmFBLD
Joseph Halfmoon

前回はpartialでexactな「剰余算」でした。今回もメンドクセー命令がつづきます。packed な BCD 整数のロード、ストア命令っす。BCD=Binary-coded decimalデス。8087FPUには「フツーの」整数とは別にBCD数を扱うための命令あり。計算できる桁数は10進18桁です。なんで18桁?

“ぐだぐだ低レベルプログラミング(231)x86(16bit)、BCD整数のロード、セーブ” の続きを読む

ぐだぐだ低レベルプログラミング(230)x86(16bit)、FPREM、剰余は正確で面倒

Joseph Halfmoon

前回はメモリオペランドを使った整数演算でした。今回は「剰余算」です。フツーのプログラミング言語の剰余演算子は整数に対するものが多いですが、8087系FPUの剰余の命令FPREMは浮動小数演算です。そのうえ、partial で exact だと。とってもメンドクセー雰囲気が漂ってくるんだが、どうなんだ?

“ぐだぐだ低レベルプログラミング(230)x86(16bit)、FPREM、剰余は正確で面倒” の続きを読む

ぐだぐだ低レベルプログラミング(229)x86(16bit)、FPUつかった整数演算

unasmFIADD
Joseph Halfmoon

前回は整数もFPUレジスタにロードした後は浮動小数と同じ指数と仮数の組み合わせ、だから「整数演算命令は不在」などと軽はずみなことを書いてしまいました。すみません。訂正させていただきます。整数演算のFPU命令あります。その理由は8087(x86)がCISCだから。演算のオペランドにメモリをとれるのだよね。忘れてました。
“ぐだぐだ低レベルプログラミング(229)x86(16bit)、FPUつかった整数演算” の続きを読む

ぐだぐだ低レベルプログラミング(228)x86(16bit)、整数のFPUレジスタ上の表現

FILD
Joseph Halfmoon

前回まで8087FPUの浮動小数を扱う命令ばかり練習してきました。でもFPUにも整数をロード/ストアする命令があるのです。しかし整数を演算する命令というのは脇役※。FPUレジスタにロードしてしまえばどんな整数も強力なテンポラリReal型に収まってしまうみたいです。今回はその様子を前回やったFXTRACT命令使って観察。
“ぐだぐだ低レベルプログラミング(228)x86(16bit)、整数のFPUレジスタ上の表現” の続きを読む

ぐだぐだ低レベルプログラミング(227)x86(16bit)、指数部の操作あれこれ

TemporaryReal
Joseph Halfmoon

前回は、絶対値や符号反転など「仮数部の符号」操作を主にやりました。仮数あれば指数あり、ということで今回は指数部中心のコマケー操作です。FRNDINT(整数丸め)、FSCALE(2のべき乗スケーリング)、FXTRACT(指数部、仮数部抽出)とな。意外と?素直な操作だけれども浮動小数のフォーマットは頭の中に置いといて。 “ぐだぐだ低レベルプログラミング(227)x86(16bit)、指数部の操作あれこれ” の続きを読む

ぐだぐだ低レベルプログラミング(226)x86(16bit)、絶対値、平方根、符号反転

FSQRT
Joseph Halfmoon

前回の対数関数前々回の指数関数と「素の機械語命令」のままでは定番関数値が直接求まらないので「ひと捻り」必要でした。今回はお楽、スタックトップに置いた値を素直に処理してくれます。浮動小数値の符号反転(FCHS)、絶対値(FABS)、そして平方根(FSQRT)です。ひとよひとよにひとみごろ~。
“ぐだぐだ低レベルプログラミング(226)x86(16bit)、絶対値、平方根、符号反転” の続きを読む