在ARMv8程序集中,如果我执行以下操作,编译器将发送错误消息:
mov w19, #16
mov x20, w19
如何将一个值从w寄存器移动到x寄存器,以及如何将值从x寄存器移动到w寄存器?
在ARMv8中,您所拥有的只是32、64位GPR,它们作为'X'寄存器访问。Arm体系结构提供了使用"W"名称访问这些寄存器的低32位的指令,即"W"寄存器是"X"寄存器的32位别名。体系结构不支持同时包含"X"one_answers"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 immediate、MOVK等。有关这些指令的详细信息,请参阅arm架构参考手册。