3

現在、特定のアドレスで SRAM の値をチェックし、一致する場合は C コードを実行するコードを作成しようとしています。これは atmega32u4 AVR チップで実行されています。これが私がこれまでに持っているものです:

volatile char a = 0;

void setup(){
}

void loop(){
asm(
"LDI r16,77\n"        //load value 77 into r16
"STS 0x0160,r16\n"     //copy r16 value into RAM location 0x0160   
"LDS r17,0x0160\n"     //copy value of RAM location 0x0160 into register r17
                          //some code to copy value r17 to char a?
 );

 if(a == 77){      
 //do something
  }
}

アセンブリから C に戻る部分がわかりません。レジスタ r17 内の値を取得して、C コードの変数に入れるにはどうすればよいですか?

私はこのコード スニペットを見つけましたが、それがどのように機能するか、またはこれが最善の方法であるかどうかはよくわかりません。

4

2 に答える 2

2

アセンブリをインライン化する方法については、こちらを参照してください。非常に具体的な理由がない限り、コンパイラに変数を処理させる必要があります。コードで volatileと宣言aしたとしても、AVR コアの GP レジスタ ファイルの 32 個のレジスタのいずれかにバインドされる可能性は非常に高くなります。これは基本的に、変数が RAM に格納されないことを意味します。コンパイラが何をしているのか本当に知りたい場合は、最終的なオブジェクト ファイルを逆アセンブルしavr-objdump -Sて調べてください。

于 2013-08-07T01:33:47.243 に答える
2
  __asm__ __volatile__ (
    "   ldi __tmp_reg__, 77"     "\n\t"
    "   sts 0x0160, __tmp_reg__" "\n\t"
    "   lds %0, 0x0160"          "\n\t"
    : "=r" (a)
    :
  );
于 2013-08-20T05:16:48.517 に答える