前回はブロック転送命令にまつわるコマケー話。今回はPUSH/POP命令にまつわるコマケー話です。x86の場合スタックへのデータの退避や復帰にはPUSH、POP命令を使います。PUSH、POP自体は分かり易い命令であるのでコマケー話など無い感じ。しかし、歴史を知らないと何でそんな命令があるの?という御供の命令もあり。
“ぐだぐだ低レベルプログラミング(192)x86(16bit)、PUSH/POPにも先祖の痕跡” の続きを読む
ぐだぐだ低レベルプログラミング(191)x86(16bit)、MOVS、所謂ブロック転送命令
前回、DIレジスタをベースに使うメモリアクセスではDSがデフォルトになる件練習。しかしDIレジスタは一部命令でESと「不可分に結びついている」のです。x86式には「ストリング転送命令」、一般には「ブロック転送命令」においてです。今回はその代表 MOVS 命令について見ていきたいと思います。コマケー話の宝庫なのよ。
“ぐだぐだ低レベルプログラミング(191)x86(16bit)、MOVS、所謂ブロック転送命令” の続きを読む
ぐだぐだ低レベルプログラミング(190)x86(16bit)、即値のMOV操作
前回ようやくx86に悪名高いセグメンテーションに踏み込みました。でもセグメントレジスタへのロード、セーブだけっす。それでもメンドクセー感じがそこはかと。今回はMOV命令、それも即値データのMOVを練習。セグメンテーションなど関係ね~と言いたいところが、やっぱり影を落として?いるのです。16ビットx86は逃げられない。
ぐだぐだ低レベルプログラミング(189)x86(16bit)、セグメントレジスタ操作
前回8086/88, 80186のセグメンテーション(ほぼほぼ80286.386以降のリアルモード相当)についておさらいしたので、今回は「メンドクセー」奴らセグメントレジスタを実際に操作してみます。といっても「読み・書き」するだけなんだけれども。そんな簡単な操作でも一筋縄でいかない感じがほの見えるのであります。
ぐだぐだ低レベルプログラミング(188)x86(16bit)、セグメンテーションその1
ことさらにMOVなど転送命令を避けて今回に至ります。流石にこの辺で悪名高い x86 のセグメンテーションについて説明しておく必要を認めました。そこで今回はリアルモードのセグメンテーションの図解といたします。まあセグメンテーションといいつつ、そのうちやるつもりのプロテクテッド・モードのそれに比べりゃ可愛いもんだけれども。
“ぐだぐだ低レベルプログラミング(188)x86(16bit)、セグメンテーションその1” の続きを読む
ぐだぐだ低レベルプログラミング(187)x86(16bit)、DECIMAL ADJUST族
前回はBCD補正命令のうち、アンパックドBCD数を扱うASCII ADJUST一族について練習しました。アンパックドあればパックドあり、今回はDECIMAL ADJUSTです。一族といっても2命令だけ。DAAとDAS。しかしDAAこそは御先祖の8ビット機(8080/8085)から受け継ぐ伝統の?命令であります。
“ぐだぐだ低レベルプログラミング(187)x86(16bit)、DECIMAL ADJUST族” の続きを読む
ぐだぐだ低レベルプログラミング(186)x86(16bit)、ASCII ADJUST一族
x86命令には「BCD補正命令」なる一族あり、その中でもパックドBCD数を扱うDAA命令は御先祖の8ビット機(8080/8085)でも存在した伝統の命令です。しかしx86ではアンパックドBCD数を扱うための頭文字にAを頂く命令どもが追加されております。強力?でも今となっては盲腸みたいなもん?どうなん?
ぐだぐだ低レベルプログラミング(185)x86(16bit)、シフト、ローテイト練習(86)
前回はx86命令(16bit)のうち「8086レベル」のシフト、ローテイト命令の動作を復習。コマケーところがメンドイものどもでした。前回は実機(実際はQEMUのエミュレーションだけれども)での動作確認をしなかったので、今回はデバッガで動かしながらの動作確認です。メンドイのでサラっと流していくぜ。いいのか?
ぐだぐだ低レベルプログラミング(184)x86(16bit)、シフト、ローテイト(86のね)
前回は、MUL(掛け算)命令。今回はレジスタやメモリの中のビットをシフトしたりローテイトしたりする命令について調査。全8種類(実際は7種類)もあり。「フツーの」RISCはこの系統の命令種類をこれほどもってません。それにキャリーフラグが影響うけること多いなど動作もクセ強。御先祖の8ビットの血統を色濃く受け継いでおると。
“ぐだぐだ低レベルプログラミング(184)x86(16bit)、シフト、ローテイト(86のね)” の続きを読む
ぐだぐだ低レベルプログラミング(183)x86(16bit)、MULのオペランドは1個?
前回はADD、SUBなどの算術演算命令、AND、ORなどの論理演算命令8種が「ほぼほぼ」以下同文ということを確認しました。でも算術演算といえば加減乗除というくらいで、乗除はどうなってんの?そこで今回は乗算命令MULを見ていきます。「何かと何かを掛ける」命令のハズなのに、アセンブラのオペランドは1個だけ。なして?
ぐだぐだ低レベルプログラミング(182)x86(16bit)、ADD以下同文?微妙に非対称?
前回、x86の16ビット命令セットからADD命令を練習。実はADDが分かれば、ADC、AND、XOR、OR、SBB、SUB、CMPの残り7命令も「ほぼほぼ以下同文」てことで理解できます。でも「ほぼほぼ」って何だ?そこで、この辺でCISCらしいx86のオペコードエンコーディングを復習。ほんとメンドクセーんだが、これ。 “ぐだぐだ低レベルプログラミング(182)x86(16bit)、ADD以下同文?微妙に非対称?” の続きを読む
ぐだぐだ低レベルプログラミング(181)x86(16bit)、ADDオペランド何でもありすぎ
前回から元祖x86、16bitCPU、8086/8088の命令セットの復習を始めました。うん十年ぶり。忘れてます。しかしArmとかRISC-Vとかの後に改めて8086の命令をみると確かに複雑、CISCだからあたりまえか。今回は整数足し算、ADD命令を練習してみます。命令にとれるオペランドがいろいろありすぎ、何でもあり?
ぐだぐだ低レベルプログラミング(180)x86(16bit)、INC/DECにCISCを見?
さて前回よりx86の最初のステップ、16ビットモードに入りました。いままでRISC-V、ArmとRISC系(Armはそれにしちゃ命令多過ぎだが)を練習してきましたが、今回からは「バリバリの」CISCデス。それほど意識することはないけれども、違いは確実にあるので気づいたところから見ていきます。 “ぐだぐだ低レベルプログラミング(180)x86(16bit)、INC/DECにCISCを見?” の続きを読む
ぐだぐだ低レベルプログラミング(179)x86、16/32/64bit、整数レジスタの発展?
長らく練習してきたArmを終え(まだ他所でやるケド)、今回からx86に入ります。Armの命令多過ぎなどと文句を垂れてきましたが、x86の命令「もっと」多過ぎ、死ぬまでに舐め終わらない気がします。そのうえ屋上屋を重ねる拡張により「古い16ビット命令」は「64ビット機では練習しずらく」なってます。どうするの?