给定下列组装代码:
ldi r26, 0x00
ldi r27, 0x01
ldi r30, 0xAC
lsl r30
lsr r30
asr r30在lsl操作之后,立即升起H、S、V和C SREG标志。我不明白为什么。我知道,当lsl操作将位移到左边时,该位7将升起C标志。我不明白的是为什么其他三面旗帜会升起。
根据atmel教学手册,lsl有效地将值乘以2。如果r30以0xAC (172)开始,那么为什么lsl使其为0x58 (88)。这也是所有旗帜升起的地方。
在这个操作之后,我理解为什么其他的操作都是这样做的,因为lsr和asr都有效地除以值2。在lsr操作之后,r30是44,在asr操作之后,r30是22。
发布于 2020-05-30 22:05:38
因为您的寄存器是8位,所以向左移动0xAC会损失一点。0xAC * 2 = 0x158,但是1丢失了(在进位标志中)。剩下的当然是您正在看到的0x58。这些标志被记录在指令集引用中如下:
H: Rd3 C: Rd7 N:如果设置了结果的MSB,则设置;否则清除。 V: n×C S: n×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
https://stackoverflow.com/questions/62109117
复制相似问题