【问题标题】:Convert C code to Assembly Code in ATmega8在 ATmega8 中将 C 代码转换为汇编代码
【发布时间】:2014-05-11 09:45:45
【问题描述】:

我想用winAVR作为编译器在ATmega8中制作一个关于精确延迟库的代码,你有什么想法将下面的代码转换为汇编代码吗?我不知道要转换代码,因为我不懂汇编。

这是代码。

static __inline__ void __variable_delay_cycles(unsigned long __count)
{
    if (__count>65535)
    {
        __count=(__count-13)/6;
        DelayCyclesUL(__count);
    }
    else
    {
        if (!__count)
            return;
        if (__count<10)
            __count=1;
        else 
            __count=(__count-6)/4;
        DelayCyclesUI(__count);
    }
}

DelayCyclesUI 和 DelayCyclesUL 是用汇编代码编写的。 谢谢。

【问题讨论】:

  • 您是否尝试将其编译为 atmega8 的程序集?
  • 将高级代码转换为汇编是编译器通常所做的。你需要一个用于 atmega8 平台的 C 编译器。
  • StackOverflow 不是提供教程或分步指南的地方。使用前面建议的 C 编译器,或者下载目标 CPU 的可用文档并开始自己翻译。如果翻译的某个特定部分不清楚,那么您可以提出关于那个的问题(准确描述您在做什么以及问题是什么)。
  • 据我了解,将其转换为汇编不符合 SO 的目的:即使有人这样做,OP 也将 仍然 自己不理解答案入场。
  • 你想达到什么目的?

标签: c assembly avr atmega atmega16


【解决方案1】:

将您的代码编译成可执行文件并在 avr-studio 中进行调试。切换到程序集视图,您将能够将已编译的代码从其中一个复制并粘贴到您自己的 asm 文件中。 根据延迟的长度,您可能会更好地考虑使用其中一个硬件计时器。

【讨论】:

    【解决方案2】:

    编译器已经将代码翻译成机器级指令。 -S compiler option 也会以汇编形式输出生成的代码。

    但是,ATmega8 具有三个硬件定时器,它们可以产生周期精确的时序,而与代码和编译器转换中使用不同选项的任何可变性无关。您应该使用硬件计时器而不是“指令循环”来实现延迟。

    【讨论】:

      猜你喜欢
      • 2014-09-01
      • 2020-11-04
      • 2011-05-04
      • 2013-01-22
      • 2021-08-16
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多