aarch64 g++:__asm中的MOV只移动64位值的低32位
aarch64 g++: MOV in __asm only moves lower 32 bits of a 64-bit value
我正在使用arch64-linux-gnu-g++(版本7.5.0(和标准集C++17为aarch64机器交叉编译代码。我的代码包括以下内容:
uint64_t inRef = 0x ... ;
...
__asm("MOV X8, %[input_i];"
:
: [input_i] "r" (inRef)
: "x8"
);
我正在将值打包到inRef中,并试图让寄存器X8保存inRef的值,以便稍后在程序中处理。当我打印inRef的值时,我可以确认它确实包含64位值。
然而,我在程序执行中看到的是,实际上只有inRef的底部32位被传递给X8,尽管inRef是uint64_t,X8作为aarch64系统的一部分,也是64位。我已经尝试过查看约束字符("r"(,但根据文档,这应该指64位寄存器[1]。我还尝试使我的代码更加明确,如[2]所示,并使用以下内容:
register std::uint64_t x7 asm("x7") = 0x ... ;
...
__asm__ volatile("MOV X8, %[input_i];"
:
: [input_i] "r" (x7)
: "x8"
);
不幸的是,同样的错误也发生了。我已经验证了我的机器实际上是一台aarch64机器,它的X寄存器确实是64位的,所以我怀疑问题可能在代码或编译中。总之,如何将aarch64中的整个64位变量移动到寄存器中?
参考文献:
[1]http://infocenter.arm.com/help/topic/com.arm.doc.100067_0610_00_en/qjl1517569411293.html
[2] 安卓工作室64位嵌入式ARM组件
您所做的实际上看起来是正确的。
对于简单的asm
包含,您可以使用引用%0
、%1
等变量的"索引"。Number是clobber列表中变量的索引
void f0 (void* self, uint64_t ref)
{
asm volatile("mov x8, %0" :: "r" (ref) : "x8");
}
在某些情况下,您可能希望强制64位寄存器使用属性%x0
表示64位寄存器,或%w0
表示32位寄存器。当32位的值被强制输入64b寄存器时,这是一种有用的情况。
void f1 (void* self, uint64_t ref)
{
asm volatile("mov x8, %x0" :: "r" (ref) : "x8");
// asm volatile("mov w9, %0" :: "r" (ref) : "x9"); <-- 'mov w9, x1' is generated, that's unsupported op
asm volatile("mov w9, %w0" :: "r" (ref) : "x9"); <-- this is fine
}
或者尽量在clobber中使用name。x
/w
属性仍然可以使用
void f2 (void)
{
uint64_t ref{0xdeadbeefdeadbeef};
asm volatile("mov x8, %x[val]" ::[val] "r" (ref) : "x8");
}
Godbolt上相同:https://godbolt.org/z/z6vKqx6bT
- 将应用程序从32位移植到64位时出现问题
- 64位机器上的C++内存对齐
- qmake:检测目标位宽(32 位或 64 位)
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- Qt 5.11.2 (Clang 8.0 (Apple), 64 位), 找不到 QJSEngine 文件
- 在 64 位边界上对齐C++结构数组?
- 如何为字符串生成唯一但一致的 N 位哈希(小于 64 位)?
- 在 64 位的 c++ 中运行 mstest 测试
- 在两个线程上读/写 64 位,无互斥/锁定/原子
- 浮点数为 32 位和 64 位二进制表示形式
- 是否有 64 位等效于 GetLastInputInfo / LASTINPUTINFO?
- 所有可能的链接生成器与64位密钥
- 为什么 std::vector 需要 is_trivial 才能按位移动,而不仅仅是is_trivially_copya
- WinAPI C++如何从 64 位应用程序加载资源
- 在 c++ 中输出 64 位整数
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 如何在 64 位平台上计算 32 位哈希C++?
- 将设置位移动到 64 位整数的末尾
- C++Visual Studio 2008,将项目从64位移动到32位
- Excel插件错误从WindowsXP 32位移动到Windows7 64位