Точка IT-команды ARM-сборка

У меня есть следующий код сборки ARM.

CMP             R0, #0
ITT EQ
MOVEQ           R0, #0x7FFFFFFF
BXEQ            LR

Во-первых, зачем нужен эквалайзер после инструкций MOV и BX? Ссылка ARM говорит, что условие (EQ) после ITT будет применено к первой команде (MOV) в IT-блоке, а затем из-за второго T в ITT EQ будет применен ко второй команде (BX) в IT-блоке. Итак, если ITT применяет EQ, почему EQ необходимо в MOVEQ и BXEQ?

Во-вторых, зачем вообще нужна ИТ-инструкция? Почему бы просто не иметь:

CMP             R0, #0
MOVEQ           R0, #0x7FFFFFFF
BXEQ            LR

Это MOV не MOVS, поэтому флаги не будут обновляться, а эквалайзер в BXEQ будет "ссылаться" на значения флага, установленные CMP.

Ответ 1

Почему бы вам просто не попробовать?

.cpu cortex-m3
.thumb
.syntax unified

    CMP             R0, #0
    ITT EQ
    MOVEQ           R0, #0x7FFFFFFF
    BXEQ            LR


    CMP             R0, #0
    MOVEQ           R0, #0x7FFFFFFF
    BXEQ            LR

сначала попробуйте

arm-none-eabi-as vectors.s -o vectors.o
vectors.s: Assembler messages:
vectors.s:13: Error: thumb conditional instruction should be in IT block -- `moveq R0,#0x7FFFFFFF'
vectors.s:14: Error: thumb conditional instruction should be in IT block -- `bxeq LR'
make: *** [vectors.o] Error 1

Это очевидно из-за отсутствия условных версий этих команд в режиме большого пальца.

чтобы оставить:

.cpu cortex-m3
.thumb
.syntax unified

    CMP             R0, #0
    ITT EQ
    MOVEQ           R0, #0x7FFFFFFF
    BXEQ            LR

которым инструменты довольны

   0:   2800        cmp r0, #0
   2:   bf04        itt eq
   4:   f06f 4000   mvneq.w r0, #2147483648 ; 0x80000000
   8:   4770        bxeq    lr

поэтому мы пытаемся без eq

.cpu cortex-m3
.thumb
.syntax unified

    CMP             R0, #0
    ITT EQ
    MOV           R0, #0x7FFFFFFF
    BX            LR

не счастлив

vectors.s:8: Error: instruction not allowed in IT block -- `mov R0,#0x7FFFFFFF'
vectors.s:9: Error: incorrect condition in IT block -- `bx LR'

Я думаю, что это должна быть просто синтаксическая вещь, которая поможет вам и убедитесь, что вы получили то, что действительно хотели.

.cpu cortex-m3
.thumb
.syntax unified

    CMP             R0, #0
    IT EQ
    MOVEQ           R0, #0x7FFFFFFF
    BX            LR

дает

   0:   2800        cmp r0, #0
   2:   bf08        it  eq
   4:   f06f 4000   mvneq.w r0, #2147483648 ; 0x80000000
   8:   4770        bx  lr

Обратите внимание, что bx lr - это одна и та же команда 0x4770, eq на конце или нет в конце, кажется явно там как синтаксическая ассемблерная вещь, которая поможет вам и убедитесь, что вы получили правильное количество инструкций, привязанных к If Then инструкция. (которое вы можете видеть, изменилось между одной условной инструкцией и двумя условными инструкциями).

Я нахожу это назойливым

.cpu cortex-m3
.thumb
.syntax unified

    CMP             R0, #0
    IT EQ
    MOVSEQ           R0, #0x7
    BX            LR

    movs r0,#7
    mov r0,#7
    movs.w r0,#7

что в этом случае используется расширение thumb2

00000000 <.text>:
   0:   2800        cmp r0, #0
   2:   bf08        it  eq
   4:   f05f 0007   movseq.w    r0, #7
   8:   4770        bx  lr
   a:   2007        movs    r0, #7
   c:   f04f 0007   mov.w   r0, #7
  10:   f05f 0007   movs.w  r0, #7

Это любопытство.

Причина, по которой это необходимо, очевидна из документации набора инструкций. Команды с полным раздувом имеют 4-битное условное поле для каждой команды. инструкции большого пальца нет. Сначала вы просто делали традиционную ветку при условии, чтобы избежать инструкций, большой палец не предлагал функцию ARM каждой условной инструкции и не нуждался в очистке трубы. Таким образом, согласно документам, они добавили инструкцию If Then (IT) с ARMv7-M, и, как указано в этих документах, это позволяет вам составлять до четырех команд, следующих за if, а затем для того, чтобы стать условными. Вышеупомянутая синтаксическая игра, на которую я верю (у меня нет доказательств, кроме того, что это просто так), помогает справиться с человеческой ошибкой.

Теперь, если не в режиме большого пальца, вы можете просто применить условное выражение к команде

.syntax unified

    CMP             R0, #0
    MOVSEQ           R0, #0x7
    BXEQ            LR

    movs r0,#7
    mov r0,#7

дает

00000000 <.text>:
   0:   e3500000    cmp r0, #0
   4:   03b00007    movseq  r0, #7
   8:   012fff1e    bxeq    lr
   c:   e3b00007    movs    r0, #7
  10:   e3a00007    mov r0, #7

и, возможно, это корень вашего вопроса, но очень возможно, что ассемблер мог просто вставить в него инструкцию IT, но на языке ассемблера есть желание быть один к одному (несмотря на все псевдо-инструкции для всех процессоры, которые там), поэтому я предполагаю, что они ожидают, что вы явно покажете, что хотите, чтобы If Then была там и/или у вас будет команда If Then. Ассемблер также помогает вам, говоря, что вам нужно использовать ИТ-блок, а не просто сказать, что это неверная инструкция.

Еще один эксперимент

.cpu arm7t
.thumb
.syntax unified

    CMP             R0, #0
    MOVSEQ           R0, #0x7
    BX            LR

    movs r0,#7

Назойливый, потому что, если вы оставите ИТ там, он знает, что это неправильно:

vectors.s:7: Error: selected processor does not support Thumb mode `it EQ'

но затем на одном дыхании говорит

vectors.s:7: Error: thumb conditional instruction should be in IT block -- `movseq R0,#0x7'

Ответ 2

В ARMv7-A и ARMv7-M редакторе ARM Architecture Reference (A4.2.1 "Условные инструкции" ) сказано следующее:

Хотя другие инструкции Thumb являются безусловными, все инструкции которые сделаны условными с помощью инструкции IT, должны быть написаны с помощью состояние. Эти условия должны соответствовать условиям, налагаемым IT-обучение. Например, команда EQ ITTEE налагает эквалайзер условие для первых двух следующих инструкций и NE условие на следующие два. Эти четыре инструкции должны быть написаны с условиями EQ, EQ, NE и NE соответственно.

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

Кроме того, для целей "унифицированного языка ассемблера" (где одна и та же сборная мнемоника может использоваться для 32-разрядных режимов ARM или Thumb), в ARM-режиме выполняется обратное. Команды IT проверяются на согласованность с условными инструкциями, которые следуют, даже если для команды IT не создается машинный код операции:

Для максимальной переносимости языка ассемблера UAL между наборами команд ARM и Thumb, ARM рекомендует:

  • Команды IT записываются перед условными инструкциями правильно для набора команд Thumb.

  • При сборе в наборе инструкций ARM ассемблеры проверяют, что все IT-инструкции верны, но не генерируют для них никакого кода.

Ответ 3

Вам нужна команда IT в режиме большого пальца, где биты состояния в остальных случаях недоступны. Ваш первый пример - это, скорее всего, код большого пальца, а не режим ARM.

зачем нужен эквалайзер в MOVEQ и BXEQ?

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

Ответ 4

Condição das próximas instruções e fornecido no "IT EQ" для примера. как предварительная инструкция по стандарту без большого пальца автомобиля при условии наличия 16-битной инструкции. нет современных 32 битов, которые имеют четкое представление о битах по конкретным условиям; Нет большого пальца руки и ничего хорошего. 1 бит особенного условия, предшествующего "IT".