ARMv8 程序集,如何将值从 w 寄存器移动到 x 寄存器?

Posted

技术标签:

【中文标题】ARMv8 程序集,如何将值从 w 寄存器移动到 x 寄存器?【英文标题】:ARMv8 assembly, How to move value from w register to x register? 【发布时间】:2020-12-03 21:25:17 【问题描述】:

在 ARMv8 汇编中,如果我执行以下操作,编译器会发送错误消息:

mov    w19,    #16

mov    x20,    w19

如何将值从 w 寄存器移动到 x 寄存器,以及如何将值从 x 寄存器移动到 w 寄存器?

【问题讨论】:

这些是相同的寄存器。 w 是低 32 位。所以mov w20, w19. 你想零扩展吗? mov w20, w19 就是这样。如果你想签名扩展,你需要一个不同的指令。询问 C 编译器。 【参考方案1】:

在 ARMv8 中,您所拥有的只是 32、64 位 GPR,它们作为“X”寄存器访问。 Arm 架构提供了使用“W”名称访问这些寄存器的低 32 位的指令,即“W”寄存器是“X”寄存器的 32 位别名。体系结构不支持同时包含“X”和“W”助记符但仅包含“X”或“W”的指令。写入“W”寄存器时,“X”的高 32 位清零。

Mov W1, W2       // zero-extend w2 into x1

在上述指令中,W1 的高 32 位清零,并将 W2 的低 32 位复制到 W1。

通常不支持同一指令中的混合寄存器大小,因此这样的指令不会汇编。

Mov X1, W2      // error: mismatched register sizes

Mov 指令还有其他变体,如 MOVZ、MVN、MOV 立即数、MOVK 等。有关这些指令的详细信息,请参阅 arm 架构参考手册。

【讨论】:

以上是关于ARMv8 程序集,如何将值从 w 寄存器移动到 x 寄存器?的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从 get_queryset() 传递到 get_context_data()

如何将值从一个活动传递到上一个活动

如何将值从 InAppBrowser 返回到 Ionic 应用程序

PySimpleGui:如何将值从一个列表框添加到另一个列表框

如何将值从反应本机应用程序传递到节点 js 后端

如何将值从 XIB 传递到 UIView 初始化程序?