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

ぐだぐだ低レベルプログラミング(63) ARM64(AArch64)、フラグの観察 adds

addsEC
Joseph Halfmoon

前回はArmの64ビット命令の即値Addを眺めてみました。それだけでも4形式の命令があったのですが、前回作成した命令表には、まったく同等な加算動作を行う命令Addsが隣に並んでいます。整数加算することはAddと同じですが、副作用、フラグを立てたり下ろしたりする、ということのみが違う命令です。なお演習はスマホ上です。

“ぐだぐだ低レベルプログラミング(63) ARM64(AArch64)、フラグの観察 adds” の続きを読む

ぐだぐだ低レベルプログラミング(62) ARM64(AArch64)、Add命令その1即値

ADD_INSN
Joseph Halfmoon

Armの64ビット命令、32ビットの時と比べると条件付き実行のフィールドが無くなって「スッキリ」した印象です。しかし、RISC-Vを眺めた後でA64(AArch64)を眺めるとなんと複雑な。伝統?のシフトできるレジスタオペランドは健在。フラグ操作のON/OFFも加わって組み合わせが多いです。とても1回では見切れませぬ。

“ぐだぐだ低レベルプログラミング(62) ARM64(AArch64)、Add命令その1即値” の続きを読む

ぐだぐだ低レベルプログラミング(61) ARM64(AArch64)、gdb -tui

gdbTUI000
Joseph Halfmoon

前々回、デフォルトでインストール済であったlldb (LLVM系?のデバッガ)を使ってみましたが、アセンブラレベルの表示がちょいと思うような感じと違っておりました。gdbとほぼほぼ互換とはいいつつも違うところはあるみたいです。そこで本家gdbをインストールし、TUIモードで動作させてみました。この感じかね。

“ぐだぐだ低レベルプログラミング(61) ARM64(AArch64)、gdb -tui” の続きを読む

ぐだぐだ低レベルプログラミング(60) ARM64(AArch64)、レジスタ一覧描いてみた

RegsAllEC
Joseph Halfmoon

前回スマホ上でアセンブラとデバッガを動かし、ARM64(AArch64)のレジスタなど眺めてみました。ARM64はARM32と大分様子が違うので主要なレジスタだけでも一覧しておくべしと図を作り始めてハマリました。調べて図を描いているだけで時間がたちます。レジスタ多すぎ?

“ぐだぐだ低レベルプログラミング(60) ARM64(AArch64)、レジスタ一覧描いてみた” の続きを読む

ぐだぐだ低レベルプログラミング(59) ARM64(AArch64)、スマホで lldb

ARM64_REG_EC
Joseph Halfmoon

スマホ上で clang の使用開始。「ARM64(AArch64)できるな」と気づきました。「できる」といってアセンブラです。以前Armをやったときは32ビットでした。手元のラズパイは皆32ビットOSで動かしているので、64ビットArmはできなかったのです。OS入れ替えるのはメンドイ。しかしスマホであれば64ビット。

“ぐだぐだ低レベルプログラミング(59) ARM64(AArch64)、スマホで lldb” の続きを読む

ぐだぐだ低レベルプログラミング(58) RISC-V、整数と浮動小数の変換命令

fcvt_EC
Joseph Halfmoon

今回は浮動小数と整数の間で変換を行う命令fcvtを動かしてみたいと思います。16種類もあります。オペコード空間を節約しているRISC-V的にはかなり大きな一族です。それは、単精度と倍精度の浮動小数、32ビット幅と64ビット幅の整数、符号付と無、変換の方向の組み合わせがあるからです。今回は端折って4命令だけ動かしてみます。

“ぐだぐだ低レベルプログラミング(58) RISC-V、整数と浮動小数の変換命令” の続きを読む

ぐだぐだ低レベルプログラミング(57) RISC-V、浮動小数点数のロード/ストア命令

RISC-V load/store float
Joseph Halfmoon

今回は珍しくメンドクない命令です。浮動小数のロード、ストアです。アドレスの指定は通常のロード、ストア同様に整数レジスタに12ビットのディスプレースメントを加える方式。これだけ。シンプル。RISCだもんね。

“ぐだぐだ低レベルプログラミング(57) RISC-V、浮動小数点数のロード/ストア命令” の続きを読む