如何从arduino中为生成的程序集添加内联注释

时间:2015-02-13 02:50:32

标签: c assembly arduino

我正在尝试在我的arduino上为生成的程序集添加内联注释。所以例如

/*
Testing
*/
#include <avr/io.h>
#include <iostream>


int ledPin = 13;

void setup()
{
 asm volatile("\n# comment 1");
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  asm volatile("\n# comment 2");
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  delay(1000);
}

为我想要查看的代码生成程序集&#34;注释1&#34;和&#34;评论2&#34;作为汇编代码中特定行的标记。

这是程序集生成的代码

C:\Users\****\AppData\Local\Temp\build1888832469367065438.tmp\sketch_jul17a.cpp.o:     file format elf32-avr


Disassembly of section .text.loop:

00000000 <loop>:
loop():
C:\Program Files (x86)\Arduino/sketch_jul17a.ino:19
   0:   80 91 00 00     lds r24, 0x0000
   4:   61 e0           ldi r22, 0x01   ; 1
   6:   0e 94 00 00     call    0   ; 0x0 <loop>
C:\Program Files (x86)\Arduino/sketch_jul17a.ino:20
   a:   68 ee           ldi r22, 0xE8   ; 232
   c:   73 e0           ldi r23, 0x03   ; 3
   e:   80 e0           ldi r24, 0x00   ; 0
  10:   90 e0           ldi r25, 0x00   ; 0
  12:   0e 94 00 00     call    0   ; 0x0 <loop>
C:\Program Files (x86)\Arduino/sketch_jul17a.ino:21
  16:   80 91 00 00     lds r24, 0x0000
  1a:   60 e0           ldi r22, 0x00   ; 0
  1c:   0e 94 00 00     call    0   ; 0x0 <loop>
C:\Program Files (x86)\Arduino/sketch_jul17a.ino:22
  20:   68 ee           ldi r22, 0xE8   ; 232
  22:   73 e0           ldi r23, 0x03   ; 3
  24:   80 e0           ldi r24, 0x00   ; 0
  26:   90 e0           ldi r25, 0x00   ; 0
  28:   0e 94 00 00     call    0   ; 0x0 <loop>
C:\Program Files (x86)\Arduino/sketch_jul17a.ino:23
  2c:   08 95           ret

Disassembly of section .text.setup:

00000000 <setup>:
setup():
C:\Program Files (x86)\Arduino/sketch_jul17a.ino:13
   0:   80 91 00 00     lds r24, 0x0000
   4:   61 e0           ldi r22, 0x01   ; 1
   6:   0e 94 00 00     call    0   ; 0x0 <setup>
C:\Program Files (x86)\Arduino/sketch_jul17a.ino:14
   a:   08 95           ret

注释不包含在汇编代码中,我该怎么做

1 个答案:

答案 0 :(得分:2)

首先评论&#34;常规&#34; (不是cpp预处理)汇编代码以井号开头,而不是两个斜杠。所以你可能想要一个名为&#34;#onesectimer&#34;的评论。在汇编代码中。

这可以通过以下方式实现:

asm("\n# onesectimer");
void OneSecTimer()
{
  if(bags!=0){
    asm("\n# for counter 1");
    if(counter1 == 3)
...

---编辑---

阅读您的评论和编辑我认为您正在混合使用&#34;汇编&#34;和&#34;反汇编&#34;:

当将C代码转换为二进制代码时,C编译器会生成&#34; assembly&#34;码。此代码可能包含注释:

# This is a comment
lds r24, 0
ldi r22, 1
call digitalWrite

汇编程序然后翻译这个&#34;程序集&#34;代码到二进制代码。在二进制代码中,不再有关于注释的信息,只有要写入内存的二进制数据。

&#34;反汇编&#34;将二进制数据转换回汇编代码,但只能反汇编二进制代码中的信息 - 因此您不能在反汇编代码中有任何注释!

您可能要做的是在感兴趣的位置将符号插入目标文件中:

digitalWrite(0,1);
asm volatile(".global Here_is_Delay\nHere_is_Delay:");
delay(1000);

这些符号的名称在整个项目中必须是唯一的,并且与所使用的任何函数或变量名称不同。

根据反汇编程序(不确定AVR),您将看到符号:

loop():
C:\Program Files (x86)\Arduino/sketch_jul17a.ino:19
   0:   80 91 00 00     lds r24, 0x0000
   4:   61 e0           ldi r22, 0x01   ; 1
   6:   0e 94 00 00     call    0   ; 0x0 <loop>

Here_is_Delay():
C:\Program Files (x86)\Arduino/sketch_jul17a.ino:20
   a:   68 ee           ldi r22, 0xE8   ; 232
   c:   73 e0           ldi r23, 0x03   ; 3
     ...