为什么 AVR 中的状态标志在对已清零的寄存器进行补码后会打开?

问题描述 投票:0回答:2

我有一段汇编代码,我必须找出为什么状态标志打开

其中一个代码是

LDI R16, 0
COM R16 

结果是0xFF 但我不明白为什么

S
C
标志会打开。

assembly avr ones-complement
2个回答
0
投票

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。


0
投票

这似乎是AVR逻辑冲突。 说明

SUB 路,Rr。 ;当 Rd 时,给出 C=1

COM 路;像 0xff-Rd 这样的操作,这将使 C=0。但实际上补码指令总是给出 C=1

© www.soinside.com 2019 - 2024. All rights reserved.