You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 18:22:16