ぐだぐだ低レベルプログラミング(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” の続きを読む

ぐだぐだ低レベルプログラミング(207)x86(16bit)、SCASとCMPS

SCASunassemble
Joseph Halfmoon

x86(16bit)のオペコードマップの「塗りつぶし」も見た目は後一息という雰囲気を醸してます。今回は過去回でMOVSのみ練習して他の命令どもから目を背けていたストリング命令の残りからSCASとCMPSを練習してみます。メモリの中から特定のパターンを見つけたり文字列同士の比較に威力を発揮するもの。まあCISCらしい。 “ぐだぐだ低レベルプログラミング(207)x86(16bit)、SCASとCMPS” の続きを読む

ぐだぐだ低レベルプログラミング(206)x86(16bit)、XLAT

Joseph Halfmoon

x86(16bit)のオペコードマップもかなり塗りつぶし出来てきて、今回は落穂拾い回。XLATとな。何の略かと問えばTRANSLATEみたい。AIの言語変換ではありませんよ。バイト単位で最大256バイトの単なる表引きデス。当時、どなたかがこういう命令が欲しいなどとリクエストしたのかな?お惚け老人には知るよしもなし。
“ぐだぐだ低レベルプログラミング(206)x86(16bit)、XLAT” の続きを読む

ぐだぐだ低レベルプログラミング(205)x86(16bit)、I/O空間とI/O命令

IOspace
Joseph Halfmoon

今回はI/O命令デス。I/O命令といってもその動作はデータの転送です。8086/8088においてはMOVと変わるのは「空間」の種別のみ。他のプロセッサ、かってのライバル?68系も、現在ブイブイ言わせている?ArmやRISC-VにもI/O空間などありませぬ。みなメモリ・マップドI/Oね。でも使っているのよねI/O。

“ぐだぐだ低レベルプログラミング(205)x86(16bit)、I/O空間とI/O命令” の続きを読む

ぐだぐだ低レベルプログラミング(204)x86(16bit)、冷遇? TEST

TESTopcode
Joseph Halfmoon

x86(16bit)の練習の最初の方で、ADD、ADC、SUB、SBB、AND、OR、XOR、CMPの8命令を練習。こいつらオペコードマップの目抜き通りに綺麗にならんでます。その中でCMP命令はSUBに似ています。一方AND命令に似ているTEST命令はオペコード的にはトビトビの場所に冷遇?されているんだこれが。

“ぐだぐだ低レベルプログラミング(204)x86(16bit)、冷遇? TEST” の続きを読む

ぐだぐだ低レベルプログラミング(203)x86(16bit)、CMC、CLC、STC

CMC_CLC_STC
Joseph Halfmoon

前回はCBWとCWDでした。今回はCMC、CLCとSTCです。似たような3文字ニーモニックの命令が続きますが他意はありません。x86は3文字ニーモニックの命令が多いだけのこと。今回の3命令に共通するのは末尾のCです。CARRY FLAGのCです。キャリーフラグ(CF)を操作したいことがそれだけ多いってこってす。

“ぐだぐだ低レベルプログラミング(203)x86(16bit)、CMC、CLC、STC” の続きを読む

ぐだぐだ低レベルプログラミング(202)x86(16bit)、CBW、CWD

u00000028EC
Joseph Halfmoon

前回はファーポインタをレジスタ組にロードするLESとLDSでした。今回は符合拡張を行うCBWとCWDです。8086らしいなと思うのは、この命令、明示的なオペランドをとりません。レジスタはキメウチ、アキュムレータのみです。この辺のレジスタの使い方に偏りがあるのが御先祖に8ビットを頂くx86らしさかと。 “ぐだぐだ低レベルプログラミング(202)x86(16bit)、CBW、CWD” の続きを読む

ぐだぐだ低レベルプログラミング(201)x86(16bit)、ポインタロード、LES、LDS

LES_LDS_pointerload
Joseph Halfmoon

前回は8086範囲をはみ出すENTER/LEAVE命令でしたが、今回は8086以来のファーポインタ(セグメント間参照)のロード命令、LESとLDSです。そろそろ8086命令は一巡するんじゃないかなどと思っていたのですが、数えてみたらまだまだ残ってます。先が長いのでそろそろ8086範囲は終わらせたいのだけれど。

“ぐだぐだ低レベルプログラミング(201)x86(16bit)、ポインタロード、LES、LDS” の続きを読む

ぐだぐだ低レベルプログラミング(200)x86(16bit)、ENTER、LEAVEその2

Joseph Halfmoon

前回は、ENTERが作り出すスタックフレームを眺めながらボヤイてましたが演習には至りませんでした。「やりたくないな~」感が充満。Debug.exeは強力なソフトウエアデバッガですが、「ソフトウエアの」デバッガです。自身がブレークかけるためにもスタックを消費。スタック操作の証拠を残すのがメンドイです。仕方ねえ、やるです。

“ぐだぐだ低レベルプログラミング(200)x86(16bit)、ENTER、LEAVEその2” の続きを読む

ぐだぐだ低レベルプログラミング(199)x86(16bit)、ENTER、LEAVEその1

EnterLeaveRetImm
Joseph Halfmoon

前回CALL/RET命令を練習。しかし即値つきRETはENTER/LEAVEと一緒ね、ということで後回し。今回はENTER/LEAVE命令(8086に不在、80186以降のx86が装備)が「想定」しているスタックフレームについて復習していきます。便利?「高水準言語とのセマンティンクギャップ」が叫ばれた当時のアダ花?
“ぐだぐだ低レベルプログラミング(199)x86(16bit)、ENTER、LEAVEその1” の続きを読む

ぐだぐだ低レベルプログラミング(198)x86(16bit)、CALLとRET

farCall
Joseph Halfmoon

前回はカウンタレジスタCXを「見て飛ぶ」LOOPとJCXZでした。今回は「呼び出したら戻る」CALLとRET命令です。例によってイントラ・セグメントとインター・セグメントの違いあり。CALLの場合はダイレクトとインダイレクトの違いもあり。いろいろあるけれど、CALL、RETは意外とフツー。

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

ぐだぐだ低レベルプログラミング(197)x86(16bit)、LOOPとJCXZ

LOOP1
Joseph Halfmoon

前回は条件フラグ共を「見て飛ぶ」条件ジャンプ命令Jccでした。今回はカウンタ・レジスタCXを「見て飛ぶ」(ついでの操作もあるけど)条件ジャンプ命令どもです。16ビットのx86はこのCXの扱いといい、ぜんぜん汎用レジスタでないです。御先祖から引きづっているものが多過ぎる?でもま、ループなど作る時には便利な命令どもです。
“ぐだぐだ低レベルプログラミング(197)x86(16bit)、LOOPとJCXZ” の続きを読む