首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么没有明确的SREG RISC指令?

为什么没有明确的SREG RISC指令?
EN

Stack Overflow用户
提问于 2020-07-02 23:25:13
回答 2查看 362关注 0票数 1

我想知道为什么Atmel RISC没有状态寄存器的“清除所有”指令,而只有单个标志清除教员,如CLN和CLS。这是一个安全的事情,迫使程序员明确地清除每一点单独和避免粗心大意?

编辑询问,因为我正在检查各种指令对类的状态寄存器的影响,当我意识到这种指令不存在时,我正在寻找一条完全重置SREG的指令

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-03 00:44:56

这是一个安全的事情,迫使程序员明确地清除每一点单独和避免粗心大意?

不,只是不值得为此提供一个特别的指导。请注意,SREG包括中断启用/禁用位和条件代码,我认为您需要同时清除这两者是非常罕见的。

(也是传输标志,即使被cmpsub这样的指令也没有修改,只用于bst / bld和相应的分支)。

你不必运行clz / cln /.按顺序排列,最多需要2条指令。由于这种特定操作并不常见或通常是有用的,所以大多数ISAs都不会为其提供指导。

只覆盖条件代码(而不是I和T),您可以用以下2条指令来完成它

ldi r16, 1 / subi r16, 0:无进位,无溢出,无半进位,结果为非零,结果为非负。subi reg,0可以清除所有具有非负寄存器值的条件代码,因此您通常可以避免额外的ldi

代码语言:javascript
复制
 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

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

数据空间中,SREG的地址是0x5F。在I/O空间中,是0x3F (维基百科)。outsts / lds短,并且比st/ld更方便,其中包含索引寄存器(X、Y或Z)的寻址模式。

若要使整个SREG (包括I和T )的零值实际上为零,则禁用中断

代码语言:javascript
复制
                     ; R1 = 0 is normally left 0 at all times, one LDI at startup
 out    $3F, r1      ; SREG = 0
票数 5
EN

Stack Overflow用户

发布于 2020-07-03 00:17:42

感谢Jester指出SREG是内存映射的。I/O编程将在下一个类中讨论,因此实际上这是一项非常琐碎的任务,因此不需要这样的指令存在.

代码语言:javascript
复制
LDI Rd, 0    ; load 0 into GPR
OUT SREG, Rd ; store register data to i/o location
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62706395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档