выражая большое количество в руке - PullRequest
3 голосов
/ 07 ноября 2011

Я пытаюсь установить регистр в 12000. Так как MOV не может поместить значение больше чем 255 на моем рисунке 12000/2 ^ 8 = 375.Но 375 все еще слишком велик и не делится на 2. Осталось ли хранить 12000 единиц памяти?Это намного менее эффективно?

Из любопытства, почему это 255, а не 256, поскольку оно без знака?

Ответы [ 4 ]

5 голосов
/ 07 ноября 2011

На какую арку ARM вы нацеливаетесь?На ARMv7 есть очень хорошее решение - инструкция movw, которая требует 16-битного немедленного:

movw r0, #12000

До ARMv7 вам нужно выполнить два шага:

mov  r0,     #0x00002e00
orr  r0, r0, #0x000000e0

Обратите внимание, что выражаемые непосредственные значения имеют ширину не только восемь битов;они восемь битов, повернутых на любое четное смещение.Кроме того, вы можете просто загрузить значение из памяти вместо немедленного.

5 голосов
/ 07 ноября 2011

традиционно arm допускает 8 или 9 бит и смену, поэтому 12000 = 0x2EE0, как указал Стивен, вы можете сделать это:

mov r0, #0x2E00
orr r0, #0x00E0

Другой способ, с помощью быстрого ярлыка:

ldr r0,=0x2EE0

, что означает, что ассемблер найдет место для установки этого значения, затем выполнит относительную нагрузку на ПК, или вы можете сделать это самостоятельно:

ldr r0,mynumber
...
mynumber: .word 12000

Более новые расширения набора команд допускают больше битов в немедленном. Я обычно использую

ldr r0,=0x2EE0

и убедитесь, что у меня есть безусловные ветви, в основном пулы для ассемблера для размещения переменных. Компиляторы обычно делают то же самое, если они не могут вписать немедленные в одну инструкцию, они склонны использовать относительный загрузочный ПК, а не множественные немедленные инструкции.

2 голосов
/ 07 ноября 2011

12 битов из 32 назначены для непосредственного значения.

8 битов, составляющих шаблон, а оставшиеся 4 бита - 16 позиций шаблона:

0x000000ff
0x000003fc
0x00000ff0
0x00003fc0
0x0000ff00
0x0003fc00
0x000ff000
0x003fc000
0x00ff0000
0x03fc0000
0x0ff00000
0x3fc00000
0xff000000
0xfc000003
0xf000000f
0xc000003f

, где 8 битшаблон помещается в набор из 8 бит.

Обратите внимание, что приведенный выше порядок не соответствует фактическому значению 4 бит.Вы действительно не должны знать такого рода вещи, если только вы не собираетесь писать какие-либо самоизменяющиеся коды во время выполнения по какой-либо причине.

Если вы хотите загрузить ЛЮБОЕ 32-битное значение в r0, используйте псевдоинструкциюldr с '='

ldr r0, = 0x12345678

Затем ассемблер преобразует его в наиболее эффективный (ые) в зависимости от архитектуры во время компиляции.

1 голос
/ 07 ноября 2011

Это 255, потому что 8-битное число в двоичном формате идет от 00000000-11111111. 11111111 - 255 в десятичном виде. Вы можете использовать XOR для обмена значениями между регистрами вместо MOV. Это имеет тенденцию быть быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...