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

ぐだぐだ低レベルプログラミング(196)x86(16bit)、条件ジャンプ命令群 Jcc

Jcc_results
Joseph Halfmoon

x86の命令どもを16ビットモードから眺めてます。今回は条件付ジャンプです。x86を含むクラシックなプロセッサでは、数多くの条件フラグを駆使してジャンプするのが普通です。しかしレジスタの依存関係以外に伏線張ると「近代化時」にメンドクセー筈。モダンなRISC-Vなどはフラグ無、条件判断は条件ジャンプ命令自体で判定だよ。
“ぐだぐだ低レベルプログラミング(196)x86(16bit)、条件ジャンプ命令群 Jcc” の続きを読む

ぐだぐだ低レベルプログラミング(195)x86(16bit)、無条件JMP

jmpDebug3
Joseph Halfmoon

x86の命令どもを16ビットモードから眺めてます。今回は無条件ジャンプです。どのプロセッサも長いのとか短いのとか複数種類のジャンプ命令を持つことが多いですが、x86はやっぱりメンドクセーです。直接に間接、nearにfarそういえばshortもあったな、という感じ。アセンブラにもコマケー指示をせんとなりません。
“ぐだぐだ低レベルプログラミング(195)x86(16bit)、無条件JMP” の続きを読む

ぐだぐだ低レベルプログラミング(194)x86(16bit)、LEA 実効アドレス

LEAcom
Joseph Halfmoon

LEA、Load Effective Addressは孤高な命令と思いきや、メモリアクセスする命令共には裏で気脈を通じているみたい。そしてメモリアクセスするかのごときアセンブリ言語表記だけれども、決してメモリにアクセスすることなくレジスタ操作を行うだけの命令。必須なこともあれば、避けて通ることもできる?なんだそれ。

“ぐだぐだ低レベルプログラミング(194)x86(16bit)、LEA 実効アドレス” の続きを読む