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

问题描述 投票:0回答: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。

assembly binary hex avr
1个回答
0
投票

由于您的寄存器是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

© www.soinside.com 2019 - 2024. All rights reserved.