0

我在 C 中创建了一些简单的代码来更改输出的占空比,我正在尝试将其转换为 Assembly,以便我可以在那里对其进行编辑并提高效率。但是,代码是为连接到 Teensy 2.0 的 Atmega32U4 编写的,每当我尝试使用常用方法翻译它时,由于使用了库(我认为),它会给我带来错误。

如果我知道如何用汇编编写代码,我会重做整个代码,但我对此一无所知。

代码如下,

#include <avr/io.h>
#define F_CPU 7800UL                // frequency of 7.8kHz
#include <util/delay.h>

int main()
{
DDRF = 0x00;            // all in F are input
PORTF = 0xFF;           // all inputs are set to low
DDRB = 0xFF;            // all in B are output
PORTB = 0x00;

while(1)
    {
    if (~PINF &(1<<PF1))            // 0.05 duty cycle
        {
        PORTB = 0b00100000;
        _delay_ms(50);
        PORTB = 0x00;
        _delay_ms(950);
        }
    else if (~PINF & (1<<PF4))      //0.73 duty cycle
        {
        PORTB = 0b00100000;
        _delay_ms(730);
        PORTB = 0x00;
        _delay_ms(270);
        }
    else if (~PINF & (1<<PF6))      //0.92 duty cycle
        {
        PORTB = 0b00100000;
        _delay_ms(920);
        PORTB = 0x00;
        _delay_ms(80);
        }
    else
        {
        PORTB = 0b00100000;
        _delay_ms(500);
        PORTB = 0x00;
        _delay_ms(500);
        }
    }
}

我很确定我没有以最有效或最正确的方式对此进行编码,但我上个月才开始学习 C。任何将其翻译为大会的建议将不胜感激。

4

1 回答 1

1

如果您的代码可以编译(如果您提到的错误是链接器而不是编译器错误),您可以编译为汇编器。

大多数 C 编译器使用“-S”或“-s”命令行选项来创建汇编文件而不是目标文件。

一些提示:大多数 C 编译器不支持像 0b00100000 这样的二进制数。也许您应该改用十六进制数字-至少要与其他编译器兼容。

于 2013-09-22T10:28:32.227 回答