c - 为什么 Gcc 会以错误的方式编译代码?

标签 c gcc compilation avr

我正在尝试找出为什么我的 AVR ATtiny861A(8 位)程序无法工作。现在我刚刚开始使用 Atmel Studio(之前我使用的是 CodeVision AVR)。

注释中带有初始 C 代码的汇编代码如下:

        if(data & 0x8000)
  84:   33 23           and r19, r19
  86:   14 f4           brge    .+4         ; 0x8c <WriteDAC+0x2e>

我无法理解这段代码如何正确工作。

Codevision 正确编译:

; 0000 00EE     (data&0x8000) ? (DAC_DIN=1) : (DAC_DIN=0);
    SBRS R17,7
    RJMP _0x10

我只发布我无法理解的代码部分。

最佳答案

AND 指令根据结果设置条件代码,该结果与输入的值相同。由于您正在测试最上面的位,因此结果为负,因此条件分支可以简单地使用“大于或等于”条件测试此标志并将其用于条件分支,这对应于 if声明。

要求 codevision 编译器生成一个 0 或 1 的变量,具体取决于最高位(因此您有不同的源代码:一个是 if 语句,另一个是三元表达式) ,这是通过将位向下移动并用零填充寄存器来完成的,这是通过使用不同类型的条件跳转来实现的。

两者都是完全正确的。

关于c - 为什么 Gcc 会以错误的方式编译代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23053669/

相关文章:

c++ - 如何正确从 D 接口(interface)到 C++?

c - C编译中断

compiler-construction - 在编译的哪个步骤中删除注释?

linux - 进行全局选项

c - 如果我尝试从 Channel 调用字符串数据,则会出现错误结果

c - 为什么我不能更改数组的第二个元素?

在C中连接两个矩阵

C 按值查找字符串

c - 我在 SPOJ、语言 C、编译器 gcc 4.3.2 中收到以下代码的运行时错误:代码为 :

c - 为什么 builtin_expect 取的是 long 而不是 bool?