Ответ 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'