aarch64中的零寄存器'zr'本质上是接地的吗?

时间:2018-09-19 16:35:43

标签: assembly cpu-registers zero arm64

最近开始弄乱AArch64程序集,我注意到它有一个严格为 zero 分配的寄存器,而(大多数)其他体系结构则只是xor var, var

我正在读的有关zr的站点将其解释为零的参考点,这听起来很像我在DC电子设备中定义接地的方式。而且由于业余爱好者使用ARM,所以在代码中将电路中的接地零归类为零对我来说很有意义。

我敢肯定它比这复杂得多,但这是一个安全的类比吗?与使用其他寄存器来获得0的方式相比,使用该寄存器会导致不同的结果吗?

5 个答案:

答案 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具有%g0MIPS具有$zero$0Itanium(严格来说不是RISC,而是VLIW,但仍然吨寄存器[128])具有r0RISC-V具有x0SH-5具有R63Blackfin具有R0i860R0PA-RISCR0ARC%r0Motorola 88000r0,{{ 3}},带有2个单独的零寄存器:整数R31和浮点数F31 ...

PowerPC略有偏差,其中r0表示GPR0或数字0,具体取决于指令。但是,针对PowerPC的计划9甚至相差Alpha

唯一具有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指令,例如ldmstm不是简单的指令。此外,它提供了大量的寻址模式,并使用了某种复杂的指令格式

     

OpenRISC

当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