2017-11-27 17 views
0

インラインアームアセンブリーでCで宣言されたローカル変数にアクセスしたい。それ、どうやったら出来るの?アームインラインアセンブリでローカルC変数にアクセスするにはどうすればよいですか?

グローバル変数は、次のように

int temp = 0; 
Function(){ 
    __asm(
     ".global temp\n\t"   
     "LDR R2, =temp\n\t"              
     "LDR R2, [R2, #0]\n\t" 
    ); 
}  

をアクセスすることができますしかし、どのように、私はローカル変数にアクセスできますか?ローカル変数に対して ".local"を ".local"に変更しようとしましたが、エラー( `temp 'への未定義参照)が発生しました。 私が使用しているIDEはKEILです。

どのような考えですか? ありがとうございました。

+2

ローカル変数は、スタック上またはレジスタ内に存在します。何らかのコンパイラサポートなしでそれらを転送するのは難しいでしょう。 GCCインラインアセンブラはそれらをレジスタに登録します。私は[KeilはGCCに基づいている]と思う(http://www2.keil.com/mdk5/compiler/6/)。 '.local'は静的なリンケージを持つ 'グローバル'を意味します。 'void foo(void){static int bar;}'を宣言すれば、この方法でbarに​​アクセスできます。しかし、それは「C」プログラマーにとっては「ローカル」という通常の概念ではありません。それは「静的」です。 –

答えて

3

GCCのドキュメントによると:あなたのasmコードの後

#include <stdio.h> 

int main(int argc, char *argv[]) { 

    int src = 1; 
    int dst; 

    asm ("mov %1, %0\n\t add $1, %0" : "=r" (dst) : "r" (src)); 

    printf("0x%X\n", dst); 

    return 0; 
} 

あなたが置く「:」文字、あなたはこのように渡したい値を6.45.2.3 Output Operands

あなたは彼らがこのような値渡すことができます。値を上書きするときはuse '='を使用し、値を読み込んだときや上書きするときは '+'(r | m)変数を使用します。値がレジスタにある場合は 'r'メモリ内に存在する場合はm 'を返します。

+0

それはAT&Tの構文( 'add src、dst')を持つx86ですが、制約付きで拡張されたASMは正しい答えです。しかし、インラインasmに 'mov 'を含めないでください。常に制約を使用し、 'src'の古い値を保存したい場合は、コンパイラに' mov'を生成させてください。例えば'asm(" inc%0 ":" = r "(dst):" 0 "(src));'したがって、 '%0'はsrcとして開始し、dst(マッチング制約)として終了します。もちろん、このようにすべてのケースで最適なコードを取得することはできません。あなたはまだコンパイラが 'lea 1(%rax)、%esi'をコピー&アドインすることを妨げています。 https://gcc.gnu.org/wiki/DontUseInlineAsm –

関連する問題