【问题标题】:atmega: register data gets corrupted by division operationatmega:寄存器数据被除法运算损坏
【发布时间】:2016-12-23 02:23:46
【问题描述】:

您好,我正在用 C 语言编写一个 olimexino (arduino)。我正在使用以下代码加载 2 个寄存器(atmega328):

asm (
"ldi r20, 0 \n" //load register r20 with 0
"ldi r21, 16 \n" //load register r21 with 16
: : : "r20","r21" //compiler directive to reserve the two registers );

然后我用这个:

asm ( "out 0x05, r21 \n" ); //write '0' to portB
asm ( "out 0x05, r20 \n" ); //write '10000' to portB

从两个寄存器写入端口 B。但是使用两个寄存器 r20 和 r21 会产生问题。如果我进行除法运算,就会发生冲突。例如,如果我的程序的任何部分有“x = x/6”或“y=x%9”之类的语句,那么我存储在这些寄存器中的数字似乎会发生变化。如果我做一个简单的除法,比如“x/​​4”或“x%8”,那就没问题了。但是任何比简单的班次划分更复杂的操作都会让我感到困惑。

有什么帮助吗?谢谢

【问题讨论】:

    标签: cpu-registers atmega


    【解决方案1】:

    将其作为一个单行多行语句:

    asm (
    "ldi r20, 0 \n" //load register r20 with 0
    "ldi r21, 16 \n" //load register r21 with 16
    "out 0x05, r21 \n" //write '0' to portB
    "out 0x05, r20 \n" //write '10000' to portB
    : : : "r20","r21" //compiler directive to reserve the two registers );
    

    或者甚至更好:

    asm (
       "out %0, %1 \n"
       "out %0, %2 \n"
       : : "i"(5), "r"(16), "r"(0));
    

    或者例行公事如何:

    void WriteToPort5(unsigned char b)
    {
       asm ("out 0x05, %0"
       : : "r"(b));
    }
    

    你可以这样称呼:

    WriteToPort5(16);
    WriteToPort5(0);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多