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

ぐだぐだ低レベルプログラミング(193)x86(16bit)、86のNOPはXCHGの別名?

xchg01
Joseph Halfmoon

過去回でRISC-VやArmのアセンブラしていた時、やたらとこの命令はあの命令のエイリアス(別名)なんてことに遭遇してました。でもエイリアスはRISCどもの専売ではありませぬ。歴史を誇るx86にもしっかりエイリアスが存在してます。まあね、ちょこっとだけれども。エイリアスのお名前はみんな知ってるNOPじゃと。

“ぐだぐだ低レベルプログラミング(193)x86(16bit)、86のNOPはXCHGの別名?” の続きを読む

ぐだぐだ低レベルプログラミング(192)x86(16bit)、PUSH/POPにも先祖の痕跡

step03
Joseph Halfmoon

前回はブロック転送命令にまつわるコマケー話。今回はPUSH/POP命令にまつわるコマケー話です。x86の場合スタックへのデータの退避や復帰にはPUSH、POP命令を使います。PUSH、POP自体は分かり易い命令であるのでコマケー話など無い感じ。しかし、歴史を知らないと何でそんな命令があるの?という御供の命令もあり。
“ぐだぐだ低レベルプログラミング(192)x86(16bit)、PUSH/POPにも先祖の痕跡” の続きを読む

ぐだぐだ低レベルプログラミング(191)x86(16bit)、MOVS、所謂ブロック転送命令

MOVS
Joseph Halfmoon

前回、DIレジスタをベースに使うメモリアクセスではDSがデフォルトになる件練習。しかしDIレジスタは一部命令でESと「不可分に結びついている」のです。x86式には「ストリング転送命令」、一般には「ブロック転送命令」においてです。今回はその代表 MOVS 命令について見ていきたいと思います。コマケー話の宝庫なのよ。
“ぐだぐだ低レベルプログラミング(191)x86(16bit)、MOVS、所謂ブロック転送命令” の続きを読む

ぐだぐだ低レベルプログラミング(190)x86(16bit)、即値のMOV操作

MOV_IMM_OPMAP
Joseph Halfmoon

前回ようやくx86に悪名高いセグメンテーションに踏み込みました。でもセグメントレジスタへのロード、セーブだけっす。それでもメンドクセー感じがそこはかと。今回はMOV命令、それも即値データのMOVを練習。セグメンテーションなど関係ね~と言いたいところが、やっぱり影を落として?いるのです。16ビットx86は逃げられない。

“ぐだぐだ低レベルプログラミング(190)x86(16bit)、即値のMOV操作” の続きを読む

ぐだぐだ低レベルプログラミング(189)x86(16bit)、セグメントレジスタ操作

SSseg
Joseph Halfmoon

前回8086/88, 80186のセグメンテーション(ほぼほぼ80286.386以降のリアルモード相当)についておさらいしたので、今回は「メンドクセー」奴らセグメントレジスタを実際に操作してみます。といっても「読み・書き」するだけなんだけれども。そんな簡単な操作でも一筋縄でいかない感じがほの見えるのであります。

“ぐだぐだ低レベルプログラミング(189)x86(16bit)、セグメントレジスタ操作” の続きを読む

ぐだぐだ低レベルプログラミング(188)x86(16bit)、セグメンテーションその1

realModeSegmentation
Joseph Halfmoon

ことさらにMOVなど転送命令を避けて今回に至ります。流石にこの辺で悪名高い x86 のセグメンテーションについて説明しておく必要を認めました。そこで今回はリアルモードのセグメンテーションの図解といたします。まあセグメンテーションといいつつ、そのうちやるつもりのプロテクテッド・モードのそれに比べりゃ可愛いもんだけれども。
“ぐだぐだ低レベルプログラミング(188)x86(16bit)、セグメンテーションその1” の続きを読む