【问题标题】:Convert Decimal to binary for AVR assembly Atmega32a将十进制转换为二进制以用于 AVR 程序集 Atmega32a
【发布时间】:2021-11-28 18:53:43
【问题描述】:

我想将我的 C 程序转换为 AVR 汇编 程序,该程序将十进制数转换为二进制数。该程序是为 Atmega32a 指定的。有人能帮我吗 ?谢谢你。 这是我需要转换为 Asssembly 的程序:

    int main()  
{  
    int num, bin = 0, rem = 0, place = 1;  
  
    printf("Enter a decimal number\n");  
    scanf("%d", &num);  
  
    printf("\nBinary equivalent of %d is ", num);  
    while(num)  
    {  
        rem   = num % 2;  
        num   = num / 2;  
        bin   = bin + (rem * place);  
        place = place * 10;  
    }  
    printf("%d\n", bin);  
  
    return 0;  
} 

【问题讨论】:

  • 假设您实际上想要unsigned int,因为负数的num % 2 将是0 或-1。此外,通常人们会转换为一串 ASCII 数字,而不是一个巨大的十进制数字,它与原始数字具有相同的 base-10 数字具有 base-2 数字。你最终想打印它,所以你的目标是最终在char buffer[17]上使用printf("%d\n")而不是puts,这只会让事情变得更难
  • 使用编译器。将源代码转换为汇编是编译器所做的。

标签: c assembly binary avr atmega32


【解决方案1】:

scanfprintf 和 atmega 不是很好的朋友 :)

十进制整数只有一个整数。

转换为二进制意味着您想要包含'0''1' 字符的字符串。

为此类任务使用函数。 此功能针对 8 位 AVR 架构进行了优化。

char *tobin(char *str, unsigned val)
{
    char *buff = str;
    unsigned mask = 1ULL << (sizeof(mask) * 8 - 1);
    char start = 0;
    while(mask)
    {   
        char bit = !!(val && mask);
        if(!start) start = bit;
        if(start) 
            *buff++ = bit + '0';
        mask >>= 1;
    }
    *buff = 0;
    return str;
}

您在此链接中的程序集: https://godbolt.org/z/osW6YYKbv

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 2021-12-30
    • 2012-06-26
    • 2012-02-23
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多