Assembly ARM汇编语言中二进制位的插入方法

Assembly ARM汇编语言中二进制位的插入方法,assembly,arm,mbed,Assembly,Arm,Mbed,我有一个LPC1768 ARM MBED处理器。现在我在R1中有一个二进制字符串:101111。 有什么办法可以做到:10100111(我在原始编号中插入2“0”)直接在原始编号中添加位 为了清楚起见,我想在ARM汇编语言中执行此操作。ARM有一些功能强大的位字段指令,可以让您高效地执行此操作 UBFX或右移,将插入位置上方的所有位保存到另一个寄存器中 按要插入的零的数量向左移动 BFI将高位(加上增加的零)插入回插入位置 BFI仅适用于即时插入位置和长度,但它会替换目标中的旧位,因此您不

我有一个LPC1768 ARM MBED处理器。现在我在
R1
中有一个二进制字符串:
101111
。 有什么办法可以做到:
10100111
(我在原始编号中插入2“
0
”)直接在原始编号中添加位


为了清楚起见,我想在ARM汇编语言中执行此操作。ARM有一些功能强大的位字段指令,可以让您高效地执行此操作

  • UBFX或右移,将插入位置上方的所有位保存到另一个寄存器中
  • 按要插入的零的数量向左移动
  • BFI将高位(加上增加的零)插入回插入位置

BFI仅适用于即时插入位置和长度,但它会替换目标中的旧位,因此您不必清除+或其他内容

对于运行时变量位置,您可能希望在Armv7上使用
~((1):

ubfx    r2, r1, #3, #3
and     r1, r1, #7
bfi     r1, r2, #5, #3
在小于v7的情况下:

lsr     r2, r1, #3
and     r1, r1, #7
orr     r1, r1, r2, lsl #5

当然有一种方法。它只是一些位运算。但它不会是一条指令。@Jester我认为实际上有一种汇编方法可以做到这一点?不是汇编方法,只需查看位并计算出位(或者如果你想做加法,就要加上值)要执行的操作。完成这些步骤,然后将它们应用到目标编程语言,无论是arm汇编还是其他语言。如果不仅仅是此位模式,而是abcdef变为abc00def,则它是按位的(加上其他一些,取决于哪种方式的步数更少)@old_timer“反向工程”通常是学习新东西更有效的方法,尤其是组装。