Arm mov 有一个限制,即立即数必须是 2 的倍数旋转的 8 位,我们可以这样写:
mov ip, #0x5000
但我们不能这样写:
mov ip, #0x5001
0x5000 可以拆分为 0x5000 + 1,我的意思是,一个有效的立即数和一个小数的总和。
那么对于给定的 32 位数字,如何快速找到最接近的有效立即数?像这样:
uint32 find_imm(uint32 src, bool less_than_src) {
...
}
// x is 0x5000
uint32 x = find_imm(0x5001, true);