如何将二进制值加载到寄存器中?
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
如果我想加载一个具有立即十六进制值的寄存器,我会这样做:
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