2016-11-18 2 views
1

Linuxでnanoテキストファイルを使用してインラインアセンブリコードを変換しようとしています。GCCインラインアセンブリエラー

__asm__ ("MOV AX, morales1\n\t" 
     "MOV BX, morales2\n\t;" 
     "ADD AX, BX\n\t;" 
     "MOV morales, AX;" 
     ); 

モラレス1と2は署名されたショートです。次のエラーが表示されます。

"Error: ARM register expected -- mov AX,morales1'"`

+1

ARMチップで作業していますか?有効なレジスタ名を提供するチップアーキテクチャのドキュメントが必要です。 AXは、指定されたターゲットアーキテクチャに対応していない可能性があります。ここをクリックしてください:http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001m/QRC0001_UAL.pdf –

+1

ARMプロセッサには、x86アセンブリコードではなくARMアセンブリコードが必要です。 –

+0

ええ、私はええ。私はラズベリーパイと一緒に働いています。フォーマットが間違っていますか?レジスタのように? – Brian

答えて

0

コンパイラが何をしているのか少しばかり思われるようです。 cコンパイラは最も簡単な方法で、c命令でファイルを取り出し、特定のプロセッサで実行するのに適したアセンブリ言語命令に変換します。

しかし、そこには多くのプロセッサがあり、プロセッサのすべてのファミリは異なるアセンブリ命令を使用します。どのようにCコンパイラはそれに対処できますか?答えは、特定のコンパイラ(通常)は単一の出力形式しかサポートしないということです。したがって、x86用のコードを出力するコンパイラ、x64を出力するコンパイラ、ARM、MIPS用のコンパイラなどがあります。すべてがC言語の入力ファイルを取る一方で、それぞれがターゲット用の適切なアセンブラ命令を出力します。

これは、コンパイラが通常のc命令(case、break、printf、scanfなど)を適切なアセンブラに変換できることを意味します。しかし、asm命令を使用するときは、コンパイラにc->アセンブラ変換を実行しないように指示しています。あなたが提供している特定のアセンブラ命令を正確に出力する必要があります。

これはすべてあなたの質問に関係していますか?

アセンブラ命令をあるプラットフォーム(x86など)から別のプラットフォーム(ARMなど)で使用しようとすると、どうなるでしょうか?まあ、主に起こるのは、うまくいかないことです。 (架空の例として)add x, yを使用しようとすると、プロセッサーがu32.xadd x, x, yを予期していると、それは本当に混乱し、あなたのアセンブラーをナンセンスとして扱うでしょう。

これはどうやって修正しますか?さて、最も賢明な計画は、あなたのCコードでアセンブリ言語を使用しようとするのを止めることです。 2つの数字を追加しようとしているようです。 cはすでにそれを行うことができる指示を持っています。

強調するには:cコードを記述し、コンパイラの出力コードを出力する方が、常に優れたアプローチです。インラインアセンブリを使用しようとすると、C言語、ターゲットプロセッサのアセンブリ言語、および使用する特定のコンパイラが選択した2つのインターフェイスルール(それぞれのコンパイラがこれをやや異なる方法で実行しているように見えます)が分かります。それは知っていると多くの権利を取得しようとしています。そして、(あなたが発見したように)それはあるコンパイラ/プロセッサから別のものへと痛みを伴います。

アセンブラを使用する必要がある場合は、ご使​​用のプロセッサ用のアセンブラ手順を覚えておく必要があります。 Google検索では、これらの手順のためのさまざまなリソースが必要です。あなたがそれを学んだら、asmコマンドを更新して正しい指示を入れることができます。