【发布时间】:2013-07-19 14:47:02
【问题描述】:
Arm mov 有一个限制,即立即数必须是 2 的倍数旋转的 8bit,我们可以这样写:
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);
【问题讨论】:
-
那么,你到底在问什么?似乎是一个相当简单的案例,“检查低位中是否有任何东西[可以很容易地添加回来],使用 AND 将其屏蔽掉,看看其余的是否可以向下移动到一个小数字”。跨度>
-
我的问题是:我想把0x5001移到ip,但是写不出来:
mov ip,#0x5001;但我可以写:mov r4, #1; add ip, r4, #0x5000;所以我想找一个算术可以从0x5001得到0x5000。而且我不想写 arm 伪指令...... -
我了解您将 #5001 加载为“5
-
将 0x5001 拆分为 0x5000+1 很简单,但是如何拆分 any 32 位数字?
-
好吧,大概“any”不起作用,因为例如 0x47111723 不能通过移位来实现。但是我上面描述的方法,“屏蔽低部分并移位”适用于 0x4200012 和 0x13ff(假设值是 8 位,移位和另外 8 位)
标签: c++ c assembly arm immediate-operand