Вопросы по IT условным кодам в сборке - PullRequest
0 голосов
/ 06 октября 2018

В большинстве примеров есть IT-команды, такие как:

ITTE   NE        ; IT can be omitted
ANDNE  r0,r0,r1  ; 16-bit AND, not ANDS
ADDSNE r2,r2,#1  ; 32-bit ADDS (16-bit ADDS does not set flags in IT block)
MOVEQ  r2,r3     ; 16-bit MOV

ITT    AL        ; emit 2 non-flag setting 16-bit instructions
ADDAL  r0,r0,r1  ; 16-bit ADD, not ADDS
SUBAL  r2,r2,#1  ; 16-bit SUB, not SUB
ADD    r0,r0,r1  ; expands into 32-bit ADD, and is not in IT block

ITT    EQ        
MOVEQ  r0,r1
BEQ    dloop     ; branch at end of IT block is permitted

ITT    EQ
MOVEQ  r0,r1
BKPT   #1        ; BKPT always executes
ADDEQ  r0,r0,#1   

Я хочу посмотреть, например, последний IT-блок в примерах.Я действительно смущен тем, что происходит.Что касается MOVEQ, я подумал, что он проверяет, если r0 = r1, и перемещает r1 в r0, если они равны.Но это не имеет смысла, если они равны.Что на самом деле происходит?

Я написал код большого пальца, который проверяет, какое число больше:

cmp r0, r1
ITE HS
movhs r0, r0
movlo r0, r1

Здесь мне нужно было сравнить регистры перед блоком IT ... Но почему всепримеры не включают сравнение по крайней мере перед рукой?Был бы другой способ написать блок IT для моего примера, который не включает сравнение?Что на самом деле происходит в этих примерах?

1 Ответ

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

Флаги - это вход в ИТ.Да, вы ставите cmp или adds или любую другую инструкцию по установке флага в какой-то момент перед it.Это не обязательно должно быть right раньше.

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

Документация для инструкции условного перехода обычно не содержит инструкций по установке флага.


Согласно Документам ARM

За исключением CMP, CMN и TST, 16-разрядные инструкции, которые обычно влияют на флаги кода состояния, не влияют на них при использовании внутри блока IT.

Но одна изпримеры ясно показывают, что вы можете изменить флаги с помощью 32-битного adds внутри ИТ-блока, и это говорит нам о том, что регулярные инструкции сравнения / тестирования разрешены.

Из документов неясно, будут ли изменены флаги в пределах IT-блок влияет на более поздние предикатные инструкции внутри блока.Я предполагаю, что они делают, но возможно, что они просто оставляют флаги измененными после блока IT.

В режиме ARM блок IT не требуется для предиката выполнения, поэтому инструкции по установке флага всегда влияют позжеинструкции.Было бы странно, если бы это было не так в режиме Thumb, тем более что IT является необязательным в некоторых синтаксисах.(Некоторые ассемблеры вставят его для вас в унифицированном синтаксисе, если собираются в режиме большого пальца.)

...