Как хранить числа со знаком в руке, используя MOV или MVN?

Я пытаюсь изучить сборку ARM, и я хотел сохранить число со знаком в регистре, это должно быть что-то вроде -

MOV R0, #-10

Но это сохраняет номер нормально, а не как число со знаком. Я пытался использовать LDRSB как -

LDRSB R0, =0x0000000A, но это выдавало мне ошибки.


person Kruti Deepan Panda    schedule 31.01.2021    source источник
comment
Что вы имеете в виду под обычно сохраняет номер? Когда я собираю MOV R0, #-10 в режиме ARM с помощью ассемблера GNU, ассемблер преобразует его в MVN R0, #9. Эта инструкция загрузит R0 с NOT 9 == 0xFFFFFFF6 == -10.   -  person Michael    schedule 31.01.2021
comment
Что касается второго примера; LDRSB не инвертирует исходный операнд (он не превратит 10 в -10), он просто расширяет операнд по знаку с 8 до 32 бит. Итак, если вы хотели -10, вы должны сказать так: LDRSB R0, =-10. Это немного странный способ сделать это, поскольку вы можете просто использовать MVN/MOV. На самом деле, GAS преобразует это LDRSB в MVN.   -  person Michael    schedule 31.01.2021
comment
какой набор инструкций? рука или большой палец? Вы имели в виду, что armv7, а не arm7, добавляет в смесь thumb2?   -  person old_timer    schedule 31.01.2021
comment
какую часть документации вы не понимаете?   -  person old_timer    schedule 31.01.2021
comment
Вы недовольны тем, что число закодировано как непосредственное для mvn? Например, машинный код нигде не содержит отрицательное целое число до 2? Почему это проблема для вашего варианта использования? Вы пишете JIT-генератор кода и хотите использовать член битового поля signed int immediate:8 или что-то в этом роде? ARM работает иначе; выберите другую ISA, такую ​​как MIPS или x86, если вам нужны простые немедленные расширенные знаки.   -  person Peter Cordes    schedule 31.01.2021
comment
какой ассемблер используете? (газ, вооружение и т.д.?)   -  person old_timer    schedule 01.02.2021
comment
Да, извините, это был глупый вопрос с моей стороны. Я понял, что если мне нужны биты со знаком, то я должен написать соответствующий код с моей стороны, принимая во внимание MSB.   -  person Kruti Deepan Panda    schedule 02.02.2021


Ответы (1)


Язык ассемблера специфичен для ассемблера. Вы имели в виду arm7 или armv7?

это гну ассемблер

mov r0,#-10
ldr r0,=-10

.thumb

mov r0,#-10
ldr r0,=-10

.syntax unified

mov r0,#-10
ldr r0,=-10

so.s: Assembler messages:
so.s:12: Error: cannot honor width suffix -- `mov r0,#-10'
so.s:7: Error: invalid immediate: -10 is out of range

Попробуйте снова

mov r0,#-10
ldr r0,=-10

.thumb

@mov r0,#-10
ldr r0,=-10

.syntax unified

@mov r0,#-10
ldr r0,=-10


00000000 <.text>:
   0:   e3e00009    mvn r0, #9
   4:   e3e00009    mvn r0, #9
   8:   4800        ldr r0, [pc, #0]    ; (c <.text+0xc>)
   a:   4800        ldr r0, [pc, #0]    ; (c <.text+0xc>)
   c:   fffffff6    .word   0xfffffff6

так вы тогда смотрели на (полноразмерный) ARM?

   0:   e3e00009    mvn r0, #9
   4:   e3e00009    mvn r0, #9

Который является самым простым из трех для кодирования. И вы можете легко увидеть кодировку в документации ARM. И инструменты уже сделали за вас половину работы (0xffffffff6).

Если вы имели в виду armv7, то

mov r0,#-10
ldr r0,=-10

.thumb

@mov r0,#-10
ldr r0,=-10

.syntax unified

mov r0,#-10
ldr r0,=-10

00000000 <.text>:
   0:   e3e00009    mvn r0, #9
   4:   e3e00009    mvn r0, #9
   8:   f06f 0009   mvn.w   r0, #9
   c:   f06f 0009   mvn.w   r0, #9
  10:   f06f 0009   mvn.w   r0, #9
person old_timer    schedule 01.02.2021