9

私は現在、ARMアセンブリ言語を学んでいます。

そのために、一部x86 code (AT&T Syntax)を ARM アセンブリ(Intel Syntax)コードに変換しようとしています。

__asm__("movl $0x0804c000, %eax;");

__asm__("mov R0,#0x0804c000");

このドキュメントから、x86 ではヒープ構造のチャンク 1 が 0x0804c000 から始まることがわかりました。しかし、で同じことをしようとするとarm、次のエラーが発生します。

/tmp/ccfNZp9F.s:174: Error: invalid constant (804c000) after fixup

問題は、ARMが32ビット命令しかロードできないことだと思います。

Question 1: Any idea what would be the first chunk in case of ARM processors?


Question 2:

前の質問から、メモリ間接アドレッシングがどのように機能するかを知っています。

以下に書かれたスニペットは同じ仕事をしていますか?

movl (%eax), %ebx

LDR R0,[R1]

私は使っているARMv7 Processor rev 4 (v7l)

4

2 に答える 2

7

x86 を見て Arm を学ぼうとするのは得策ではありません。1 つは CISC で、もう 1 つは RISC で非常に醜く、はるかにクリーンです。アーキテクチャ リファレンス マニュアルの命令セット リファレンスを見て ARM を学ぶだけです。mov 命令、add 命令などを調べます。

ARM は Intel 構文を使用しません。ARM 構文を使用します。

インライン アセンブリを使用して学習しないで、実際のアセンブリを記述します。ハードウェアではなく、最初に命令セットシミュレーターを使用してください。

ARM、Mips などは固定語長を目指しています。では、たとえば、即値をレジスタに移動し、レジスタを指定し、32 ビットの即値をすべて 32 ビットに収める命令をどのように適合させますか? ありえない。したがって、固定長の命令セットの場合、任意のレジスターに必要な即値を単純にロードすることはできません。その命令セットのルールをよく読む必要があります。mips では 16 ビットの即値が可能で、arm 命令セットと命令のフレーバーに応じて 8 プラスまたはマイナスのアームが可能です。これらの 16 ビットを上位または下位に配置できる mips 制限、arm では、arm 命令セット (arm、thumb、thumb2 拡張機能) のフレーバーに応じて、これらの 8 ビットを 32 ビットレジスタの任意の場所に配置できます。

ほとんどのアセンブリ言語と同様に、次のようなことを行うことでこの問題を解決できます

ldr r0,my_value
...
my_value: .word 0x12345678

CISC では、即時は命令に追加されるだけなので、0 バイト離れていても 20 バイト離れていても、どちらのアプローチでもそのまま残ります。

ARM アセンブラでは、通常、次のショートカットも使用できます。

ldr r0,=something
...
something:

これは、r0 に何かの ADDRESS をロードすると言います。その場所のコンテンツではなく、アドレス (lea など) です。

しかし、それはこの即時のショートカットに適しています

ldr r0,=0x12345678

アセンブラでサポートされている場合、値を保持するメモリ位置を割り当て、ldr r0,[pc,offset] 命令を生成してそれを読み取ります。即値が mov のルール内にある場合、アセンブラーはそれを mov rd,#immediate に最適化する可能性があります。

于 2013-06-25T13:52:49.130 に答える