この記事について
この記事は僕がアセンブリ言語に興味を持ち、理解したことをメモ程度に書く記事です。
勿論誤ったことを記述することが多くあると思うので、それを楽しむ程度に見てくれると幸いです。
なんでARMなのって思うかもしれませんが、手元に気軽に検証でそうなのがラズパイくらいだったからです
基本は以下のリンクを参考にさせてもらっています。
[アセンブラ] ARMの仕様を見てみる
レジスタ
32bit の r0 から r15までの16個
-
r0〜r13までは汎用レジスタ -
r13-- スタックポインタ -
r14-- リンクレジスタ -
r15-- プログラムカウンタ
別名など
| レジスタ | 別名 | レジスタ | 別名 | |
|---|---|---|---|---|
| r7 | wr | r12 | ip | |
| r9 | sb | r13 | sp | |
| r10 | sl | r14 | lr | |
| r11 | fp | r15 | pc |
諸々
@でコメントアウト
[r1]とかの括弧くくりはメインメモリ上のアドレスのこと
#は即値(ただの値)
命令
基本的に以下の構文
命令 デスティネーション 第1オペランド 第2オペランド
mov
レジスタ間で値を代入する。
レジスタに直接値を代入する場合はmovtを併用して上位16bitと下位16ビットで分けて代入するらしい。
mov r1, r2 @ r1 <- r2
add / sub
デスティネーションに第1と第2オペランドを足したもの/引いたものが代入される。
add r1, r2, r3 @ r1 = r2 + r3
sub r1, r2, r3 @ r1 = r2 - r3
ldr / str
ldrはオペランドに指定されたアドレスの値を、デスティネーションレジスタに代入する。
strはデスティネーションレジスタの値を、オペランドに指定されたアドレスに書き込む。
ldr r4, [r10] @ r4 <- [r10]
str r4, [r10] @ r4 -> [r10]
push / pop
近いうちに書きます
...
とりあえずこんだけでも、少しはニーモニックが読めた!
また色々理解できたら記述していこうと思います