给出以下汇编代码:
ldi r26, 0x00
ldi r27, 0x01
ldi r30, 0xAC
lsl r30
lsr r30
asr r30
立即执行lsl操作之后,将引发H,S,V和C SREG标志。我不明白为什么。我知道,当lsl操作将位向左移动时,该位7将引发C标志。我不明白的是为什么其他三个标志会升起。
根据the atmel instruction manual,lsl有效地将值乘以2。如果r30以0xAC(172)开头,那么为什么lsl将其设为0x58(88)。这也是所有标志都升起的地方。
[此操作后,我明白了为什么其他所有事情都会做它做的事情,因为lsr和asr都将值有效地除以2。在lsr操作之后,r30为44,而在asr操作之后,r30为22。
由于您的寄存器是8位,向左移0xAC
将丢失一点。 0xAC * 2 = 0x158
但丢失1
(在进位标志中)。其余的当然是您看到的0x58
。这些标志在指令集参考中记录为:
H:Rd3
C:Rd7
N:如果设置了结果的MSB,则设置;否则否则清除。
V:N xor C
S:N xor V
Rd3
是输入操作数的位#3。已设置,因此H = 1
。
Rd7
是输入操作数的位#7。已设置,因此C = 1
。
未设置结果的MSB,所以N = 0
。
V = N xor C = 0 xor 1 = 1
S = N xor V = 0 xor 1 = 1