2013-08-06 133 views
3

我目前正在嘗試編寫一些代碼來檢查某個地址處的SRAM值,然後執行一些C代碼(如果它匹配)。這是在一個atmega32u4 AVR芯片上運行的。以下是我迄今爲止: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代碼?

我確實發現了this代碼片段,但是我不太明白它是如何工作的,或者如果這是解決這個問題的最佳方法。

+2

內聯語法看起來與gcc相同。這可以幫助:http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html – dbrank0

回答

2

See here on how to inline assembly.除非您有一個非常具體的原因,否則您應該讓編譯器爲您處理變量。即使您在代碼中聲明a是易失性的,它也可能會綁定到AVR內核的GP寄存器文件中的32個寄存器中的任何一個。這基本上意味着,變量永遠不會存儲在RAM中。如果你真的想知道你的編譯器在做什麼,請用avr-objdump -S反彙編最終的目標文件並研究它。

2
__asm__ __volatile__ (
    " ldi __tmp_reg__, 77"  "\n\t" 
    " sts 0x0160, __tmp_reg__" "\n\t" 
    " lds %0, 0x0160"   "\n\t" 
    : "=r" (a) 
    : 
);