Как загрузить двоичные значения в регистры? - PullRequest
0 голосов
/ 25 октября 2018

Если бы я хотел загрузить регистр с непосредственным шестнадцатеричным значением, я бы сделал это так:

MOV R2,#0xBEEF

, но что если я хочу загрузить регистр со значением, которое доступно только дляя в двоичном?Например, если я хочу загрузить двоичное значение 0010 0000 0000 1100, которое равно 200C в шестнадцатеричном формате.Есть ли какой-то особый синтаксис, такой как #0b0010000000001100?Или мне нужно написать макрос, который мог бы преобразовать шестнадцатеричный код в двоичный?

1 Ответ

0 голосов
/ 25 октября 2018

GNU-ассемблер для ARM (AArch32) принимает константы base-2 в формате 0b0101 везде, где принимается 0x или другой числовой литерал.Удивило, что вы не просто попробовали это, так как уже догадались.

Например, MOV R2, #0b0010000000001100 собирается в

e302200c        movw    r2, #8204       ; 0x200c

с gcc -c -marm arm-binary.s.

YouЯ хотел бы использовать ldr r2, =0b010101, если он не кодируется с помощью одной инструкции mov, например, -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
...