前回までで「特権なし」で楽しく使える分岐命令はだいたい網羅したので、今回から「懸案」のSIMD命令、FP命令に入っていきたいと思います。新たなレジスタファイルが登場します。Vレジスタとな。まあ、X86_64ほど複雑怪奇ではないものの、それなりに込み入ってます。今回は冒頭の画像1枚描いて力尽きました。 “ぐだぐだ低レベルプログラミング(101)ARM64(AArach64)SIMD&FPレジスタ” の続きを読む
ぐだぐだ低レベルプログラミング(100)ARM64(AArach64)、レジスタ間接分岐
今回はレジスタ間接分岐命令をエクササイズしてみます。といって一族命令には今までも「お世話」にはなっとります。LR(リンクレジスタ、X30)に向かって分岐するRET命令もレジスタ間接分岐命令と原理的には同じもの。レジスタ間接分岐では論理絶対番地でどこへでも飛べますが、とび先番地には気を付けないと。
“ぐだぐだ低レベルプログラミング(100)ARM64(AArach64)、レジスタ間接分岐” の続きを読む
ぐだぐだ低レベルプログラミング(99)ARM64(AArach64)、所謂call、ret
今回はいわゆるCALL命令をエクササイズしてみます。A64的にはBL命令ですが。またいままで見て見ぬフリ?をしてきていたスタックポインタも登場、だいたいA64でPUSH/POPするのはどしたらよいのでしょうか?32ビットのArmとはだいぶ違う感じ。ここを乗り越えるとA64のABIが見えてくる。ホントか? “ぐだぐだ低レベルプログラミング(99)ARM64(AArach64)、所謂call、ret” の続きを読む
ぐだぐだ低レベルプログラミング(98)ARM64(AArach64)、条件分岐CBNZ族
前回は条件フラグを「見て」飛ぶ一般的な条件分岐命令B.condでした。しかし思い起こせばRISC-Vでは条件フラグが無く、「その場」でレジスタの内容を判断して飛ぶ命令ばかりでした。A64でもそういう命令が無いわけではないです。今回はフラグを使わずレジスタの内容で分岐するCBNZ命令一族について実習してみます。
ぐだぐだ低レベルプログラミング(97)ARM64(AArach64)、条件分岐B.cond
前回までロードストア命令を実習してきました。まだまだロードストアあるのですが別件実習してからの方がよさそうな奴らばかりなので一たんお休み。今回から分岐命令に入りたいと思います。最初は条件分岐命令です。どのプロセッサも「似たようなもん」ですが、条件の組み合わせを全部通すのはメンドイです。
やっつけな日常(49) raspinfo、このコマンドなんだっけ? RaspberryPi
UbuntuおよびRaspberryPi OSを使っているとき、ほぼ無意識に apt update、apt upgrade している自分がいます。更新ファイルが多数であればほぼザルなのですが、少ないと妙に目に留まることがあります。今回はそれです。Raspinfo です。あれ、なんだっけこのコマンド?使ったことあった?
“やっつけな日常(49) raspinfo、このコマンドなんだっけ? RaspberryPi” の続きを読む
ぐだぐだ低レベルプログラミング(96)ARM64(AArach64)、ロードストア命令その7
さらっとニーモニックを一通り撫でるつもりでも命令多すぎArmです。アドレッシングモードはロード命令でやったし、データサイズは幅だけだからなどと言い訳を言って、大幅に手を抜きました、ハイ。今回はストア命令の「落穂ひろい」編であります。微妙にロードとは非対称だけれども大体はあるのだ、ストアにも。 “ぐだぐだ低レベルプログラミング(96)ARM64(AArach64)、ロードストア命令その7” の続きを読む
ぐだぐだ低レベルプログラミング(95)ARM64(AArach64)、ロードストア命令その6
今回からストア命令に入ります。前回までのロード命令に比べるとお楽です。ロード命令で既にやったからということで面倒なアドレシングモードをパスしてしまったせいもあります。しかし何と言っても符合について考える必要ないのがうれしいです。ストアするときはデータ幅さえ指定すりゃよいと。 “ぐだぐだ低レベルプログラミング(95)ARM64(AArach64)、ロードストア命令その6” の続きを読む
ぐだぐだ低レベルプログラミング(94)ARM64(AArach64)、ロードストア命令その5
今回扱うLDP命令には、デスティネーションが2つあります。といって驚いちゃいけません。32ビットのArm命令(A32)には任意本数のレジスタをスポポンと1命令で出し入れするLDM/STMなどという命令まであったことに比べれば、A64は「抑え気味」です。でも言いたくなります。それでもRISCかよ?と。 “ぐだぐだ低レベルプログラミング(94)ARM64(AArach64)、ロードストア命令その5” の続きを読む
ぐだぐだ低レベルプログラミング(93)ARM64(AArach64)、ロードストア命令その4
今回はイミディエイト・オフセットで同じアドレスを指すのに2通りの命令がある話。一つはスケールド12ビット、もう一つはスケール無9ビット。12ビットあればいいじゃん、と思わないこともないのですが、心の広いArm様です。アン・アラインドなアクセスはお勧めしないけれど一律禁止ではありません。よってスケールしない命令も必要と。
ぐだぐだ低レベルプログラミング(92)ARM64(AArach64)、ロードストア命令その3
A64のロード命令をさらっています。元より組み合わせを網羅しようなどとは考えておらず「ありがちな」例を「通り一遍」なでるだけのつもりなのですが、Armは命令数が多いっす。ロードだけでもどんだけ?今回は、前回積み残しのアドレシングモードを使ってみます。POST/PRE-indexみたいな「複雑な」奴らも登場。 “ぐだぐだ低レベルプログラミング(92)ARM64(AArach64)、ロードストア命令その3” の続きを読む
ぐだぐだ低レベルプログラミング(91)ARM64(AArach64)、ロードストア命令その2
前回、Armのロードストア命令のアドレシングモード複雑怪奇、などと書きながら、今回実習に使用いたしますのは「ベース+オフセット」一択です。人生複雑にしたくない人はそれが一番、違うか。ロードストアは1命令テストするのにもメモリを用意しないといけないので、準備のCのコードがメンドイのよね。文句が多いな。
“ぐだぐだ低レベルプログラミング(91)ARM64(AArach64)、ロードストア命令その2” の続きを読む
ぐだぐだ低レベルプログラミング(90)ARM64(AArach64)、ロードストア命令その1
今回からロードストア命令に入ります。気が重いです。Armは下手なCISC(多分x86のことだよ)よりもアドレシングモードが複雑怪奇。オペランドによっては特例的な規則もあります。64ビット化したおかげで、バイト、ハーフワード、ワードに加えてダブルワード(SIMD考えるともっと)あり、それに符合がからんで大変。 “ぐだぐだ低レベルプログラミング(90)ARM64(AArach64)、ロードストア命令その1” の続きを読む
ぐだぐだ低レベルプログラミング(89)ARM64(AArach64)、除算命令
前回までの整数乗算命令「いろいろ」あって全4回を要しました。今回は整数除算命令ですが、この1回で完了です。乗算のような組み合わせの多さもエイリアスもなくシンプル。シンプル・イズ・ベスト?シンプル・ライフ?(古い)でも除算はいいけれど剰余算はどうよ?というと「すでにやっていた」事実が発覚。なんてこったい。
“ぐだぐだ低レベルプログラミング(89)ARM64(AArach64)、除算命令” の続きを読む