为什么 lsl 和 lsr 函数会导致 SREG 中出现这些标志

Why do the lsl and lsr functions cause these flags in the SREG

给定以下汇编代码:

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: Set if MSB of the result is set; cleared otherwise.

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