最近开始弄乱AArch64程序集,我注意到它有一个严格为 zero 分配的寄存器,而(大多数)其他体系结构则只是xor var, var
。
我正在读的有关zr
的站点将其解释为零的参考点,这听起来很像我在DC电子设备中定义接地的方式。而且由于业余爱好者使用ARM,所以在代码中将电路中的接地零归类为零对我来说很有意义。
我敢肯定它比这复杂得多,但这是一个安全的类比吗?与使用其他寄存器来获得0的方式相比,使用该寄存器会导致不同的结果吗?
答案 0 :(得分:7)
零寄存器xzr
分别为。 wzr
是Aarch64 ISA中的一个可爱的设计技巧。它的寄存器号是31,就像堆栈指针sp
一样。 wsp
。根据具体情况,寄存器编号31是其中之一。
这个可爱的技巧使Aarch64 ISA可以简化其指令集。例如,cmp xn, xm
指令实际上是subs xzr, xn, xm
,即它是一个减法,结果被丢弃。 mov xn, xm
就是orr xn, xzr, xm
。寄存器31仅被认为是有意义的堆栈指针,并且已明智地选择了指令集,因此您几乎从不了解此细节。
答案 1 :(得分:2)
您可以认为该寄存器中的位硬接地。但是对其进行写操作不会造成短路。 Unix /dev/zero
是一个更好的类比:丢弃写入,将读取作为零字节的无限流。
但是不,它不是相对于事物相对而言的“参考”。不论AArch64是否具有此寄存器,逻辑0
位都可能在CPU中存在,并且不与它们进行比较以确定它们是否为真。从电气上讲,逻辑1
通常是高压,并且0
=地,因此门确实会将其输入与地进行比较,任何地方的所有0
位都等于地。 (这可能是一个过分的简化,当然,在ALU内部或某些内部,位可能会颠倒或物理上不存在,只是在逻辑上以其他某种表示形式存在。)
因此,作为 analog 根本不起作用。作为对其物理/电气实现方式的描述,它也不完全起作用。它需要丢弃写入而不会造成短路。在具有寄存器重命名的CPU中,需要在RAT(寄存器分配表)中对它进行特殊处理,以跟踪写入被丢弃且依赖项链不会通过xzr
传播的事实。如果您忽略这一点,则可以想象一个SRAM单元的替身,其输入断开,输出硬接线为零。
看起来像笨拙的措辞;更好的描述是零寄存器是一个固定常数,它会静默丢弃写入。
读取它会为您提供一个固定的常数零,这有时很有用(例如用于将零存储到内存中而无需先将寄存器归零)。除非该上下文为您提供了相同寄存器编号的sp
别名,否则为您。我不太了解AArch64。
答案 2 :(得分:2)
要回答我认为是标题的问题,否,我认为这不是一个特别“安全”(有用)的类比。
电气工程中的地面概念具有非常特殊的语义和许多相关概念,但是与“固定零寄存器”的关系非常切线,因为两种情况都涉及数字零。
除了在两个概念中都存在零之外,在类比中我看不出有太多用处。几乎可以肯定,它不能反映寄存器如何实现的现实,也不能让您将电气工程知识中的概念映射到ARM汇编编程中。如果您对零寄存器的工作方式有疑问(例如,“写入时会发生什么?”),似乎不太可能通过引用类比来回答。
我不知道为什么(未链接的)网站使用术语 参考点表示零,但是我认为完全可以忽略“参考点”语言是安全的。就是零当您读取它为零时,以及当您写入它时,它什么也不做。 fuz's answer中对此进行了解释。
所有这些,如果您发现这种类比对您来说是有用的心理构造,那么在您自己的学习过程中使用它就没错!
答案 3 :(得分:1)
aarch64中的零寄存器'zr'是否基本接地? ...这是一个安全的比喻吗?
不。那里有各种各样的硬件逻辑。 归零寄存器的位是否接地并不重要,因为这只是实现细节 。您只需要将其视为数字零,以及如果我们读取或写入该寄存器会发生什么。在软件中工作时不要考虑底层电路
例如,许多体系结构可能使用具有0V表示逻辑1的倒逻辑(active-low),那么零寄存器实际上将连接到V cc 。或者其他一些使用平衡逻辑,其中逻辑0和1分别由-V cc 和V cc 表示。在这种情况下,零寄存器将连接到-V cc ,并且也不接地。
但为什么寄存器为零?
一般的RISC原理是避免在每条指令中使用内存,而仅允许加载/存储指令接触内存。因此,RISC体系结构需要大量的寄存器,以减少溢出到内存的需求。
几乎所有其他RISC体系结构都具有至少32个寄存器,因此值得为零常数指定一个。我们可以看到:SPARC具有%g0
,MIPS具有$zero
或$0
,Itanium(严格来说不是RISC,而是VLIW,但仍然吨寄存器[128])具有r0
,RISC-V具有x0
,SH-5具有R63,Blackfin具有R0
,
i860有R0
,PA-RISC有R0
,ARC有%r0
,Motorola 88000有r0
,{{ 3}},带有2个单独的零寄存器:整数R31
和浮点数F31
...
PowerPC略有偏差,其中r0
表示GPR0或数字0,具体取决于指令。但是,针对PowerPC的计划9甚至相差Alpha
r0
to 0 by software 唯一具有32个寄存器但没有零寄存器的奇数RISC体系结构是Why MIPS uses R0 as "zero" when you could just XOR two registers to produce 0? Intel,但同样奇怪的Plan 9也是i960。另一个奇怪的野兽是requires the R3 register to be set to 0 by software,其中 R0也通过软件初始化为0 。这意味着R0不应用作目标,因为对其进行写入会破坏该值
寄存器0使设计人员可以删除许多指令,从而简化了硬件。例如,我们不再需要mov
,而是只需将add
设为零并存储在目标位置即可。否定现在也只是从零减去。写入零寄存器将丢弃结果,我们也不需要单独的NOP
。 ARM和Intel i960没有零寄存器,因此在ISA中有明确的mov
指令
ARM始终是一个例外,因为它只有 16个寄存器(实际上是〜12-13,因为SP,PC ...已包含在通用组中),因此将专用寄存器设为零浪费。此外,ARM还不被认为是纯RISC,因为它的指令和寻址模式太复杂了(每条指令中都有LDM,STM,移位和有条件...)
即使ARM是RISC体系结构,它也没有像MIPS那样严格遵循RISC原则。例如,某些ARM指令,例如
ldm
和stm
不是简单的指令。此外,它提供了大量的寻址模式,并使用了某种复杂的指令格式
当Arm Holdings决定Aarch64也将有32个寄存器时,他们肯定会做同样的事情以使指令集更具RISCy和Guide to RISC Processors: for Programmers and Engineers。现在PC,SP ...也分开了,因此与ARM相比,我们的寄存器多于两倍。他们没有理由不像其他人那样使硬件变得更加复杂
SuperH体系结构也类似,其中SH-4版本具有16个寄存器。当瑞萨电子将其扩展到SH-5中的64个寄存器时,它们还为零常数保留了R63
答案 4 :(得分:0)
zr 基本上是地面
是的。无论您对哪种架构感兴趣,答案都是肯定的。
以下是一段 Verilog 代码,用于显示实现细节。 zr 始终绑定到 0(接地)。而当您的软件代码尝试写入 zr 寄存器时,低级硬件只是通过不响应 cpu 的写使能信号而保持不变。
always@(posedge clk, negedge rst_n) begin
if(~rst_n) begin // initial values when reset released.
zr <= 32'b0;
end else if(re) begin // read enable
zr <= 32'b0;
end else begin // write enable has no effect, for zr equels itself
zr <= zr;
end
end