ARMアセンブリでr0と0xFFFFFFFFを比較する方法と命令表記の解説

C言語関連

ARMアーキテクチャでは、逆アセンブルや命令表記を理解することが重要です。特にレジスタと即値の比較においては、0と0xFFFFFFFFでは表記が異なるため注意が必要です。この記事では、r0と0xFFFFFFFFを比較する場合の命令例や書き方を詳しく解説します。

基本的なCMP命令の構造

ARMでの比較命令はCMPを用います。CMPは指定したレジスタと即値または別のレジスタを比較し、結果をフラグレジスタに反映します。

例として、r0と0を比較する場合は「E3500000」という16進数の命令で表されます。この命令は条件コードやオペランド指定を含んだ形式です。

0xFFFFFFFFとの比較の注意点

r0と0xFFFFFFFFを比較する場合、単純にCMP r0, #0xFFFFFFFFとは書けません。ARM命令では即値が12ビットまで制限されているため、大きな値は複数の命令に分ける必要があります。

一般的には、MVN命令を利用して0xFFFFFFFFを生成し、CMP命令で比較する方法が取られます。例えば以下の手順です:
1. MVN r1, #0 ; r1に0xFFFFFFFFをセット
2. CMP r0, r1 ; r0とr1を比較

命令例の解説

上記のMVNとCMPの組み合わせにより、大きな即値を直接CMPで指定できない制約を回避できます。MVNはビット単位で反転する命令で、#0を反転させると0xFFFFFFFFが得られます。

逆アセンブルで確認すると、CMP r0, r1として出力され、r1には0xFFFFFFFFが格納されている状態になります。

まとめ

ARMアセンブリでr0と0xFFFFFFFFを比較する場合は、12ビット即値制約のため直接CMPに指定できません。MVN命令で0xFFFFFFFFを生成し、別のレジスタにセットしてからCMPで比較する方法が一般的です。

この方法を理解することで、逆アセンブルを読む際や命令生成の際に正確に値を比較することができます。

コメント

タイトルとURLをコピーしました