ぐだぐだ低レベルプログラミング(77)ARM64(AArch64)、EXTR、RORでもある

EXTR
Joseph Halfmoon

前回までのビットフィールド転送命令群と比べて今回のレジスタ抽出命令EXTRの動作は分かり易いです。エイリアスもシンプル、たった1個。ROR(右ローテイト)命令だけです。ただ、左にシフトして取り出すような操作のEXTRに対して、詰まっているデータから見ると右ローテイトに見えると。左右が時々混乱するのは私だけ? “ぐだぐだ低レベルプログラミング(77)ARM64(AArch64)、EXTR、RORでもある” の続きを読む

ぐだぐだ低レベルプログラミング(76)ARM64(AArch64)、UBFM命令、伸縮自在

UBFM
Joseph Halfmoon

前回は符号付きのビットフィールドMOV命令、SBFMのエクササイズでした。今回は符号無のビットフィールドMOV命令、UBFMです。これまた多くのエイリアスの名のもとにいろいろな命令に化ける命令です。似た命令であるSBFMと「対称」と思って見に行くと期待を裏切られます。SBFMであったものが無いです。でも無くても大丈夫。 “ぐだぐだ低レベルプログラミング(76)ARM64(AArch64)、UBFM命令、伸縮自在” の続きを読む

ぐだぐだ低レベルプログラミング(75)ARM64(AArch64)、SBFM命令、変幻自在

SBFM
Joseph Halfmoon

今回は前回に引き続き第72回で調べたビットフィールドMOV命令をエクササイズしたいと思います。今回の命令はSBFM命令(サイン付きBFM)です。SBFM命令の動作説明図を上に再掲載します。しかし図を見てもなんだかよく分からない命令デス。しかしこれが変幻自在、エイリアスの隠れ蓑の下で多数の「重要命令」の実体となります。
“ぐだぐだ低レベルプログラミング(75)ARM64(AArch64)、SBFM命令、変幻自在” の続きを読む

ぐだぐだ低レベルプログラミング(74) ARM64(AArch64)、BFM命令、別名不在

BFM_alias
Joseph Halfmoon

今回は、前々回調べたビットフィールドMOV命令の実習です。最初から躓きました。BFM命令の別名(エイリアス)のBFC命令、アセンブラに拒否られました。実体命令であるBFMは存在しているんですがね。そのくせディスアセンブラは頼みもしないのにBFM命令をBFC命令にディスアセンブルしてくれます。いろいろあるのね、きっと。

“ぐだぐだ低レベルプログラミング(74) ARM64(AArch64)、BFM命令、別名不在” の続きを読む

ぐだぐだ低レベルプログラミング(73) ARM64(AArch64)、MOV命令の実習

movEC
Joseph Halfmoon

前回前々回と実機練習をサボって調べ物をしていたので、今回は練習あるのみです。でも溜まっている数が多いです。今回は、前々回のMOV命令に絞って練習してみます。一通り撫でるだけでも命令数多いです。単なるMOV、転送命令なんだけれども。そう単純でもないんだこれが。

“ぐだぐだ低レベルプログラミング(73) ARM64(AArch64)、MOV命令の実習” の続きを読む

ぐだぐだ低レベルプログラミング(72) ARM64(AArch64)、ビットフィールドMOV

SBFM
Joseph Halfmoon

前回、MOV命令の込み入った事情を図にしただけで「実習はまた今度」などと書きました。しかし今回も「また今度」の回であります。MOV命令の親戚?ビットフィールドMOV命令群がこれまた込み入っているためであります。ビットフィールド転送命令と聞くと地味な?感じがしますが、これがどうして非常に多数の命令に化けるのであります。

“ぐだぐだ低レベルプログラミング(72) ARM64(AArch64)、ビットフィールドMOV” の続きを読む

ぐだぐだ低レベルプログラミング(71) ARM64(AArch64)、MOVの込み入った事情

MOVZMOVN_A
Joseph Halfmoon

前回まで論理演算命令の「代表」AND命令をやりました。今回からは他の論理演算ORRやXORは飛ばし、転送命令MOVへ入りたいと思います。A64の命令多すぎ、さっさとやらないと終わりませぬ。しかしMOV、されどMOVであります。例によってMOVという実体なくaliasで紡がれているのですが事情いささか込み入っております。

“ぐだぐだ低レベルプログラミング(71) ARM64(AArch64)、MOVの込み入った事情” の続きを読む

ぐだぐだ低レベルプログラミング(70) ARM64(AArch64)、論理命令AND一族#2

AndTable2
Joseph Halfmoon

前回に続き、A64の論理演算命令群、AND一族の2回目です。今回は演算結果をフラグに反映する「S」のついた命令どもをエクササイズしてみます。またands命令の「エイリアス」、tst命令についてもそのコード生成確認とともに練習してみます。Arm64ビットのクセに慣れればこれはこれでらくちん。

“ぐだぐだ低レベルプログラミング(70) ARM64(AArch64)、論理命令AND一族#2” の続きを読む

ぐだぐだ低レベルプログラミング(69) ARM64(AArch64)、論理命令AND一族#1

AndTable
Joseph Halfmoon

今回よりA64の論理演算命令に入ってまいります。AND、OR、EOR、NOTくらいさらっと撫でて終わりっしょ、と思うとさにあらず。便利な合わせ技あり、例によってのエイリアス、そして細かい凸凹もありです。今回は論理演算命令中の大族、AND系命令一族を練習してまいりたいと思います。

“ぐだぐだ低レベルプログラミング(69) ARM64(AArch64)、論理命令AND一族#1” の続きを読む

ぐだぐだ低レベルプログラミング(68) ARM64(AArch64)、算術命令エイリアス#2

ArithAliasTable2
Joseph Halfmoon

前回に続きARM64の算術演算命令のエイリアスを動かしていきたいと思います。テーマはNegate、「符号反転」命令です。「2の補数」世界なので符号ビットの操作では終わりませんよ。上の表をみていただけばお分かりのとおり、NEG、NEGS、NGC、NGCSと4命令もあります。まあみんなSUB系命令のエイリアスですが。

“ぐだぐだ低レベルプログラミング(68) ARM64(AArch64)、算術命令エイリアス#2” の続きを読む

ぐだぐだ低レベルプログラミング(67) ARM64(AArch64)、算術命令エイリアス#1

ArithAliasTable
Joseph Halfmoon

前回ようやく終わったadd系(足し算)の次はsub系(引き算)かというと似たことを繰り返しても仕方ないなと思いました。そこで算術演算命令の中で「微妙な」cmp系へ行きたいと思います。RISCあるあるの「実はcmp命令なんて無い」というオチの命令群です。勿論ちゃんと動作します。裏ではsub系命令が暗躍?していますぞ。

“ぐだぐだ低レベルプログラミング(67) ARM64(AArch64)、算術命令エイリアス#1” の続きを読む

ぐだぐだ低レベルプログラミング(66) ARM64(AArch64)、adc、加算キャリー付

ADD_INSN_ADDC
Joseph Halfmoon

add系命令の5回目です。流石にそろそろaddを終わらせて次回は次の命令に行きたいと思います。addの最後を飾る?のはadc、キャリー付きのaddです。ソースオペランドレジスタ2個に加えてキャリーフラグの1ビットを加えるもの。この命令に関してだけは、オペランドのシフトも拡張もありません。良かった簡単で。

“ぐだぐだ低レベルプログラミング(66) ARM64(AArch64)、adc、加算キャリー付” の続きを読む

ぐだぐだ低レベルプログラミング(65) ARM64(AArch64)、レジスタ拡張付きadd

addEXTB_EC
Joseph Halfmoon

Armの64ビット命令をさらっと舐めるつもりが、add命令も既に4回目です。今回動かしてみますのが、符号拡張、ゼロ拡張、狭いビット幅のオペランドを広いビット幅に拡張してから足し込む命令です。とりあえず拡張前はバイト縛りといたしましたが、それでも選択肢が多すぎ。テストの組み合わせは8命令です。Armの命令多すぎないか。

“ぐだぐだ低レベルプログラミング(65) ARM64(AArch64)、レジスタ拡張付きadd” の続きを読む

ぐだぐだ低レベルプログラミング(64) ARM64(AArch64)、シフト付きadd

addSFTc_EC
Joseph Halfmoon

Armは64ビット化するときに32ビットであった「余計なもの」を捨ててます。しかしレジスタをシフトしてから演算という命令は捨てなかったです。アドレス計算などに便利なようでいて、実はそれほど頻繁に使う分けでもない命令(個人の感想です。)RISC-Vなどは持ってない類。もはやArmの伝統といっても良い機能かと。

“ぐだぐだ低レベルプログラミング(64) ARM64(AArch64)、シフト付きadd” の続きを読む