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
  __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 回答
2

请参阅此处了解如何内联汇编。除非您有非常具体的原因,否则您应该让编译器为您处理变量。即使您a在代码中声明为易失性,它也很可能绑定到 AVR 内核的 GP 寄存器文件中的 32 个寄存器中的任何一个。这实质上意味着,变量永远不会存储在 RAM 中。如果你真的想知道你的编译器在做什么,反汇编最终的目标文件avr-objdump -S并研究它。

于 2013-08-07T01:33:47.243 回答