如何将二进制值加载到寄存器中?

How to load binary values into registers?

如果我想加载一个具有立即十六进制值的寄存器,我会这样做:

MOV R2,#0xBEEF

但是如果我想加载一个值只能以二进制形式提供给我的寄存器怎么办?例如,如果我想加载二进制值 0010 0000 0000 1100,即十六进制的 200C。有没有像#0b0010000000001100这样的特殊语法?或者我是否必须编写一个可以将十六进制转换为二进制的宏?

用于 ARM (AArch32) 的 GNU 汇编程序在接受 0x 或其他数字文字的任何地方接受 0b0101 格式的 base-2 常量。很惊讶你没有尝试,因为你已经猜对了。

例如MOV R2, #0b0010000000001100汇编成

e302200c        movw    r2, #8204       ; 0x200c

gcc -c -marm arm-binary.s.

如果无法使用单个 mov 指令进行编码,您会希望使用 ldr r2, =0b010101,例如 -mcpu=cortex-m4 -mthumb

mov r2, #0b111000
ldr r2, =0b010101
ldr R2, =0b0010000000001100

arm-none-eabi-gcc -c -mcpu=cortex-m4 -mthumb arm-binary.s汇编成这个机器码:

00000000 <.text>:
   0:   2238            movs    r2, #56 ; 0x38
   2:   f04f 0215       mov.w   r2, #21
   6:   f242 020c       movw    r2, #8204       ; 0x200c