我正在尝试找出为什么我的 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/