为什么 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
给定以下汇编代码:
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