【问题标题】:Why isn't there a clear SREG RISC instruction?为什么没有明确的 SREG RISC 指令?
【发布时间】:2020-07-02 23:25:13
【问题描述】:

我想知道为什么 Atmel RISC 没有针对状态寄存器的“全部清除”指令,而只有像 CLN 和 CLS 这样的个人标志清除讲师。强制程序员单独显式清除每个位,避免粗心大意,是安全的事情吗?

[edit] 询问是因为我正在检查各种指令对类状态寄存器的影响,并且当我意识到此类指令不存在时,我正在寻找完全重置 SREG 的指令

【问题讨论】:

  • RISC 的缩写是什么意思? ...为什么要添加不必要的说明?
  • 您通常只关心特定的标志位。无论如何,SREG 是内存映射的,因此您可以清除它。它也是 i/o 映射的。不过,要使用一条指令完成此操作,您将需要一个零寄存器。
  • 你需要这样的指令做什么?很少需要这样的指令,绝对不足以在其上花费一个操作码和死空间。
  • 我投票结束这个问题,因为它不是编程问题,而是对特定设备系列的 ISA 的抱怨。

标签: assembly avr status-register


【解决方案1】:

强制程序员单独显式清除每个位,避免粗心大意,是安全的事情吗?

不,只是不值得为此提供特殊说明。请注意,SREG 包括中断启用/禁用位和条件代码,我想您很少需要同时清除两者。

(还有传输标志,即使cmpsub等指令也不会修改,仅用于bst/bld和相应的分支)。

您不必依次运行clz / cln / ...,最多需要2条指令。由于此特定操作不常见或通常有用,因此大多数 ISA 不会费心为其提供说明。

仅涵盖条件代码(不是 I 和 T),您可以在 2 条指令中使用
ldi r16, 1 / subi r16, 0:无进位,无溢出,无半进位,结果非零,结果非负。 subi reg,0 用于清除具有任何非负寄存器值的所有条件代码,因此您通常可以避免额外的 ldi

 cp  r16,r16       ; clears all condition codes except Z=1. (I and T unmodified)
 clz               ; Z=0

第二种方式无需修改任何其他寄存器即可。 (andi/or 保留一些未设置的条件代码,但像 add/sub/compare (cp) 这样的指令将它们全部写入。)任何数字减去自身为 0,没有进位、溢出或任何东西。 cp 就像 sub 保持其目的地不变。


一些 ISA 提供了一种将其标志寄存器(如果有的话)复制到通用寄存器或从通用寄存器复制的方法,但 AVR 不需要涵盖所有极端情况,因为它的寄存器是内存映射的,包括 SREG。它是一个 RISC CPU,在其 16 位固定宽度指令格式中更好地用于有限的操作码空间。

Data space中,SREG的地址是0x5F。在I/O space 中,它是0x3F (wikipedia)。 outsts / lds 短,并且比 st/ld 更方便,寻址模式涉及索引寄存器(X、Y 或 Z)。

真正将整个归零SREG,包括I和T,禁用中断

                     ; R1 = 0 is normally left 0 at all times, one LDI at startup
 out    $3F, r1      ; SREG = 0

【讨论】:

  • 如果这变成了讲座,请原谅我,但有什么区别:{ldi r16, 0;出 $3F, r16} 和 {ldi r16, 0; sts $5f, R20} 如果他们都完成同样的事情,我发现的唯一区别是“out”只需要 1 个时钟周期,而“sts”需要 2 cc。也谢谢你的回答!
  • @adrwstn: sts 是一个 4 字节(2 字)指令,显然并非在每个 AVR 上都可用。所以就像我在回答中所说的那样,更短又更小(更快)。 (删除了我的第一条评论;您的第一条评论缺少代码)。
  • 如果正在编写的代码遵循 AVR ABI,则不需要 ldi 指令:寄存器 r1 将始终保持值 0 [avr-libc 中的初始化例程具有清除它的代码]。一个简单的 {out $3F, r16} 就足够了。
【解决方案2】:

感谢 Jester 指出 SREG 是内存映射的。 I/O 编程将在下一堂课中介绍,所以事实证明这实际上是一个非常微不足道的任务,因此没有必要存在这样的指令......

LDI Rd, 0    ; load 0 into GPR
OUT SREG, Rd ; store register data to i/o location

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 2023-04-01
    • 2018-11-22
    • 2023-03-22
    • 2020-01-01
    • 2019-04-16
    • 1970-01-01
    相关资源
    最近更新 更多