c - 如何向 arduino 生成的程序集添加内联注释

标签 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);
}

当为代码生成程序集时,我希望看到“注释 1”和“注释 2”作为汇编代码中该特定行的标记。

这是汇编生成的代码

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

汇编代码中没有包含注释,我该怎么做

最佳答案

首先,“常规”(未经过 cpp 预处理)汇编程序代码中的注释以井号开头,而不是以两个斜杠开头。因此,您可能希望在汇编代码中包含名为“# onesectimer”的注释。

这可以通过以下方式存档:

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

--- 编辑 ---

阅读您的评论和编辑,我认为您混淆了“汇编”和“反汇编”这两个词:

将 C 代码转换为二进制代码时,C 编译器会生成“汇编”代码。此代码可能包含注释:

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

然后汇编器将这个“汇编”代码翻译成二进制代码。在二进制代码中,不再有关于注释的信息,只有要写入内存的二进制数据。

“反汇编”将二进制数据转换回汇编代码,但只能反汇编二进制代码中存在的信息 - 因此您不能在反汇编代码中添加任何注释!

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

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
     ...

关于c - 如何向 arduino 生成的程序集添加内联注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28491732/

相关文章:

c - 为什么预处理器条件给我这个输出

assembly - 'callq *(%rax)' 是什么意思?

Arduino 软件在 OS X Yosemite 上的“工具”->“串行端口”中找不到我们的开发板

c - 如何从 C 调用 MATLAB 代码?

c# - 将树结构解析为 If 语句

c - 当IP指向0时调试指令指针

assembly - 不使用 MASM 5.0 将堆栈字节添加到 .EXE 文件

c - 爱特梅尔微 Controller : difference between UBRR0H and UBRRnH

arduino - 如何为Arduino代码提供条件编译?

c - 介子构建 : How to define dependency to a library that cannot be found by `pkg-config` ?