VS2022 ARM64编译:能否控制立即数生成避免代码混存数据?
强制VS2022 ARM64编译器禁用优化时生成mov+movk指令而非存储立即数
可以实现,核心是通过显式指定指令序列绕过编译器默认的立即数存储策略——在/O0(禁用优化)模式下,编译器为保留调试信息,会优先将大立即数存入代码段或数据区再通过ldr加载,不会主动合成mov+movk指令。以下是两种可靠方法:
方法1:使用ARM64内联汇编
直接编写目标指令序列,完全控制生成的汇编代码,不受编译器优化策略影响:
// 示例:将0x11223344加载到w8寄存器并赋值给变量 int value2; __asm { mov w8, 0x1122 // 加载低16位 movk w8, 0x3344, lsl 16 // 加载高16位并左移16位 str w8, [value2] // 将寄存器值存入变量 }
如果仅需在代码中直接使用寄存器值,跳过str指令即可。
方法2:使用ARM64编译器内在函数
VS2022提供了对应ARM64指令的内在函数,禁用优化时也能生成预期指令序列:
#include <intrin.h> // 合成32位立即数:先加载低16位,再将高16位插入到对应位置 uint32_t value2 = _MOVK(_MOVW(0x1122), 0x3344, 16);
_MOVW对应mov指令加载16位立即数,_MOVK对应movk指令将16位立即数插入到指定偏移位(此处为16位,即高半部分)。
两种方法均无需启用任何优化开关,完全满足你保留代码控制权的需求,不会出现编译器移除变量或修改代码序列的情况。
内容的提问来源于stack exchange,提问作者raff
相关产品推荐
相关产品推荐

