В большинстве примеров есть 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 для моего примера, который не включает сравнение?Что на самом деле происходит в этих примерах?