我有一段汇编代码,我必须找出为什么状态标志打开
其中一个代码是
LDI R16, 0
COM R16
结果是0xFF 但我不明白为什么
S
和 C
标志会打开。
COM 不是“完整的”,它是“补码”(按位取反)。 阅读手册,其中解释了每条指令如何设置标志。 http://atmel-studio-doc.s3-website-us-east-1.amazonaws.com/webhelp/GUID-0B644D8F-6 7E7-49E6-82C9-1B2B9ABE6A0D-en-US-1/GUID-7066B778-FBFB-4B81-A2B1-5E04395FB24D.html
它将“操作”描述为
Rd ← $FF - Rd
- 我猜 AVR 的进位标志 与 ARM 一样在减法时反转(非借位)? 是的,我们可以从 sub
的文档中看到 ,如果 C
有 sub Rd, Rr
,它会设置 Rd >= Rr
,如果我没看错的话? 嗯,关于“绝对值”的东西看起来很奇怪,不能 100% 确定它相当于 ARM 所做的事情,尽管我猜想它的 sub
/ sbc
可以工作。
所以我认为
com
与 sub
完全设置了 $ff
标志,这对于 AVR 来说可能很容易在内部实现。
关于com
如何实际设置状态标志的文档特别指出它总是将C设置为1。所以当然它总是这样做。 有趣的是,这可能是因为
0xff - anything
不能有无符号溢出并环绕产生借用。
N 标志根据结果设置,V(有符号溢出)始终被清除,因此根据寄存器的高位设置 S = N^V,在您的情况下变为 1。
这似乎是AVR逻辑冲突。 说明
SUB 路,Rr。 ;当 Rd
COM 路;像 0xff-Rd 这样的操作,这将使 C=0。但实际上补码指令总是给出 C=1