2016-06-15 4 views
3

これはしばらくの間グーグルではありましたが、これに関するドキュメントは見つかりませんでした。私はARMを勉強しようとしていましたが、何が起こっているのか理解できるかどうかを確認するために書いた単純なcalculator.cプログラムのコンパイル済みARMアセンブリコードを見てきました。ARMのLDR命令の右側にある=記号はどういう意味ですか?

LDR  R3, =__stack_chk_guard__GLIBC_2.4 

または

LDR  R0, =aEnterOperator ; "Enter operator: " 

または

LDR  R0, =aSIsNotAValidOp ; "%s is not a valid operator. Enter +, -" 

注:私は見ておく事は、このような指示であるセミコロンの後のようなものがIDAによって追加だけで自動コメントです。

私の質問は、これらのLDRの右側の「=」はどういう意味ですか?最初のケースでは、ライブラリの読み込みを示すタグのようです。 2番目と3番目のケースでは、 '= a'はprintfの前にあるようです。私は、ドキュメントでLDRのこの構文について何も見つけることができないので、これを行うのはあまり確かではありません。誰かが私にこれを理解させるのを助けることができるかありがとうございました!

+0

どのアセンブラを使用しますか?アセンブラのドキュメントを読んだことはありますか? – Olaf

答えて

8

LDR命令の第2オペランドの先頭に等号(=)を使用すると、LDR pseudo-instructionの使用が示されます。このpseuo命令は、ARM命令セットがはるかに小さい範囲の即値のみをサポートしているにもかかわらず、単一の命令で任意の32ビット定数値をレジスタにロードするために使用されます。

=の後の値がアセンブラによって認識され、MOVまたはMVN命令のイミディエート値の許容範囲に収まる場合、MOVまたはMVN命令が生成されます。それ以外の場合は定数値がリテラルプールに格納され、PC-relative LDR instructionがレジスタに値をロードするために使用されます。

Idaがコードを逆アセンブルするときにこれらのLDR =命令を生成している場合、見ているコードを生成するときにアセンブラまたはコンパイラが第2のオプションを選択したことが検出されているはずです。実際の指示はLDR R0, loc_1234567(より正確にはLDR R0, [PC, #-1234]のようなもの)であり、Idaはリテラルプールの値をloc_1234567で検索しています。

2

=は、通常、即値の定数が後ろに付いており、定数を近くのリテラルプールに配置し、それをロードするための相対的なメモリオペランドpcを生成するようにアセンブラに指示します。これは、ARM命令フォーマットが完全な32ビット定数を格納するのに十分なスペースを持たないために有用である。 8ビットでエンコードできない定数を読み込んで、近くのリテラルプールからシフトすることは、この問題を回避する効果的かつ効率的な方法です。

関連する問題