アームアセンブリ研究ノート(8)-レジスタの使用


  • プログラムでは、16個の汎用レジスタのうち14個を使用して独自のデータを保存できます。r13およびr15はspおよびpcレジスタであり、使用できません。

  • ATPCSは、スタックポインターが8バイト境界で整列されることを指定しています。

  • ATPCSは、呼び出された関数が実行の前後でr4-r11の内容が変更されないことを保証する必要があることを規定しています。以下に示すように:


次の保存テンプレートを使用できます。

routine_name
                    STMFD sp!, {r4-r12, lr} ; stack saved registers
                    ; body of routine
                    ; the fourteen registers r0-r12 and lr are available
                    LDMFD sp!, {r4-r12, pc} ; restore registers and return
r12は、8バイトのスタックポインターアライメント用に保存されます。

  • ATPCSは、関数呼び出し中に、r0〜r3を使用してパラメーターを渡し、4つを超えるパラメーターがスタックに保存されることを規定しています。戻り値はr0に格納する必要があります。

  • LDMやSTMなどのマルチレジスタプッシュおよびポップ命令の場合、レジスタリストのレジスタ番号は昇順である必要があります。

  • ダブルワードのロードおよびストア命令、LDRDおよびSTRD、オペランドレジスタは2つの隣接するレジスタ、RdおよびRd + 1であり、このRdのレジスタ番号は偶数でなければなりません。
  • アセンブリルーチンを作成するときは、物理レジスタ番号ではなくレジスタ名を使用すると、レジスタの再割り当てとコードの保守が容易になります。
  • レジスタを保存するために、比較的桁数の少ない変数をレジスタに保存し、シフト演算によって対応する変数を取り出すことができます。以下の例をご覧ください。
sample = table[index];
index += increment;
通常の状況では、インデックスとインクリメントは16ビットを超えないため、以下に示すように、それらを同じレジスタに格納できます。

上記のCコードは、次のアセンブリコードで実装できます。

LDRB sample, [table, indinc, LSR#16] ; table[index]
ADD indinc, indinc, indinc, LSL#16 ; index+=increment




元の記事を60件公開 44のよう 訪問数340,000以上

おすすめ

転載: blog.csdn.net/beyond702/article/details/52241376