【发布时间】:2020-09-18 09:21:45
【问题描述】:
给定以下汇编代码:
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。 -
好的,有道理。感谢您的帮助!但是,为什么在此操作之后会引发其他标志?
-
文档在这些方面是明确的。