我想知道为什么Atmel RISC没有状态寄存器的“清除所有”指令,而只有单个标志清除教员,如CLN和CLS。这是一个安全的事情,迫使程序员明确地清除每一点单独和避免粗心大意?
编辑询问,因为我正在检查各种指令对类的状态寄存器的影响,当我意识到这种指令不存在时,我正在寻找一条完全重置SREG的指令
发布于 2020-07-03 00:44:56
这是一个安全的事情,迫使程序员明确地清除每一点单独和避免粗心大意?
不,只是不值得为此提供一个特别的指导。请注意,SREG包括中断启用/禁用位和条件代码,我认为您需要同时清除这两者是非常罕见的。
(也是传输标志,即使被cmp和sub这样的指令也没有修改,只用于bst / bld和相应的分支)。
你不必运行clz / cln /.按顺序排列,最多需要2条指令。由于这种特定操作并不常见或通常是有用的,所以大多数ISAs都不会为其提供指导。
只覆盖条件代码(而不是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。
一些ISAs提供了一种将其标志寄存器(如果有)复制到/从通用寄存器的方法,但是AVR不需要覆盖每个角落的情况,因为它的寄存器是内存映射的,包括SREG。它是一个RISC CPU,它在16位固定宽度指令格式中对有限的操作码空间有更好的使用。
在数据空间中,SREG的地址是0x5F。在I/O空间中,是0x3F (维基百科)。out比sts / 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发布于 2020-07-03 00:17:42
感谢Jester指出SREG是内存映射的。I/O编程将在下一个类中讨论,因此实际上这是一项非常琐碎的任务,因此不需要这样的指令存在.
LDI Rd, 0 ; load 0 into GPR
OUT SREG, Rd ; store register data to i/o locationhttps://stackoverflow.com/questions/62706395
复制相似问题