当我有以下代码时:
int value2 = 0x11223344;
VS2022编译器(arm64)生成:
StarFunction PROC
...
ldr w8,|value_label|
...
...
...
ret
|value_label|
DCD 0x11223344
ENDP
如您所见,值0x11223344在函数末尾生成为“data”。
有没有什么方法可以控制它,这样它就可以生成:
mov w8, 0x1122
movk w8, 0x3344, lsl 16
我不能使用编译器优化,因为我需要控制生成的代码来修补特定的代码序列。通过编译器优化,我失去了这种控制。
我已经尝试了不同的编译器优化开关,但其中一些没有效果,其他更积极的优化甚至删除了“0x11223344”的声明,并直接在代码中使用它。
总而言之,我能以某种方式“强制”编译器避免“数据”与arm64中的立即值代码混合吗?
1条答案
按热度按时间3b6akqbq1#
我发现用“volatile”声明局部变量,比如:
并且还使用
/Ox
进行编译,使编译器在声明它的预期位置生成所需的mov Wn, imm16_low; movk Wn, imm16_high, lsl 16
。下面是一个完整的例子(用
/Ox
编译)生成: