【问题标题】:Why do the lsl and lsr functions cause these flags in the SREG为什么 lsl 和 lsr 函数会导致 SREG 中出现这些标志
【发布时间】: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 = 0x1581 丢失(在进位标志中)。剩下的当然是你看到的0x58
  • 好的,有道理。感谢您的帮助!但是,为什么在此操作之后会引发其他标志?
  • 文档在这些方面是明确的。

标签: assembly binary hex avr


【解决方案1】:

由于您的寄存器是 8 位,因此向左移动 0xAC 会丢失一点。 0xAC * 2 = 0x1581 丢失(在进位标志中)。剩下的当然是你看到的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

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2021-06-03
    • 2019-10-25
    相关资源
    最近更新 更多