ARM64とアセンブラ

ARM64 base instructions
https://developer.arm.com/documentation/ddi0602/2023-12/Base-Instructions?lang=en

汎用レジスタの数が30個、汎用レジスタのサイズが64ビット
よく使われる命令
– mov : レジスタ間のコピー
– ldr : メモリからレジスタに読み出し
– b : 無条件分岐
– bl : サブルーチン呼び出し
– add : 加算
– cmp : 比較
– str : レジスタからメモリへ格納
– ldb : スタックから取り出し
– stp : スタックへ格納
– adrp : レジスタにアドレスを設定
– cbz : 比較して0なら分岐
– b.eq : 等しければ分岐
– ret : サブルーチンから戻る
– sub : 減算
– b.ne : 異なれば分岐
– adr : レジスタにアドレスを設定
– cbnz : 比較して非0なら分岐
– and : ビット積

スタックへの複数レジスタの退避/復帰が2つのレジスタに限定されたLDP/STPに変わっている
ARM64では全ての命令を32ビットで表現

### メモリ、バイト、レジスタ、エンディアン
アセンブリでは2進数やエンディアンという概念を知っておく必要がある
8ビットが1バイト
アナログとは中間も扱うもので、デジタルは0と1のみ
10進数より16進数の方が使われる
補数(complement)を使うことで演算処理が早くなる
64ビットCPUではレジスタから16エクサバイトのメモリを指定できる
64bit レジスタはbytes, Half word, Word, Double Wordを扱える

### エンディアン
レジスタの内容の小さい側をメモリアドレスの小さい側に格納するのをリトルエンディアンと呼ぶ
x86, x86064, arm64はリトルエンディアン、PowerPCはバイエンディアン