2011-08-12 19 views
16

Co zrobić następujący wiersz w zespole ramienia:itte w zespole ramienia

000031e6  2916 cmp r1, #22 
000031e8  bf1a itte ne 

dostanę pierwszą linię (porównując r1 do 22) ale co z drugiej linii (nigdy nie widziałem polecenia itte before i googling nie zwróciło nic)

Odpowiedz

46

Jest ramienia jeżeli Instrukcja -THEN-ELSE, która została wprowadzona w zestawie instrukcji Thumb-2. (W oparciu o twój konkretny przykład powyżej, pomocne byłoby, gdybyś pokazał 3 kolejne instrukcje, które nastąpiły po instrukcji ITTE, zrozumiesz, dlaczego po przeczytaniu tej odpowiedzi.)

Ta instrukcja jest używana do obsługi małych sekwencji kodu warunkowego, do 4 instrukcji. Pomyśl o tym, jako o innym sposobie realizacji warunkowej realizacji ARM (np. BNE - instrukcja rozgałęzienia jest wykonywana tylko wtedy, gdy nie ustawiono flagi zerowej).

Korzyść z tego jest to, że unika kary biorąc oddział (prawdopodobnie nauczyłem o rurociągi itp)

instrukcja jest nieco zaangażowane, ale po owinąć głowę wokół niego, to całkiem elegancki.

to ma postać:

IT<x><y><z><cond>

gdzie x, y i z jest opcjonalny i musi być T (dla "a następnie") lub E (jako "inne"). <cond> jest dowolnym z warunków, takich jak NE lub EQ lub GT itp., Które są odzwierciedlane w flagach APSR.

Więc zawsze mają jedną T postępując zgodnie I (instrukcja jest IT po wszystkim!), A następnie 0-3 E 's lub T wieku. Dla każdego T i każdego E musisz mieć kolejną instrukcję w tej samej kolejności, która pasuje do siebie. Każda pasująca kolejna instrukcja musi mieć warunki, które pasują do instrukcji IT.

Niedźwiedź ze mną, wiem, że to jest mylące. Podam tutaj kilka przykładów do zilustrowania.

Minimalna forma nauczania byłoby coś takiego:

IT LT 
SUBLT.W R2, R1 

W tym przypadku, jeśli LT jest prawdziwe (za flagami APSR), odejmowanie odbędzie.Zauważ, że LT w SUB pasuje do LT w instrukcji .

pełnowymiarową Przykładem może być coś takiego:

ITETT NE 
ADDNE R0, R0, R1 
ADDEQ R0, R0, R3 
ADDNE R2, R4, #1 
MOVNE R5, R3 

Więc mamy THEN ELSE TO WTEDY (TETT), z NE stanie. Zwróć uwagę na następujące 4 instrukcje warunkowe (4 instrukcje, 1 każda dla TETT), instrukcje "THEN" mają warunek NE, a instrukcja "ELSE" (druga instrukcja po instrukcji IT - pamiętaj, że E było drugą 4 E i T) ma przeciwny warunek. To nie może być nic innego, tj. Byłby to błąd, gdyby było to coś w rodzaju LT zamiast EQ. EQ jest przeciwieństwem NE.

Tak więc jeśli jest prawdziwe, instrukcje 1, 3 i 4 zostaną wykonane. W przeciwnym razie (EQ) zostanie wykonana tylko instrukcja 2 (ADDEQ).

Podałem przykłady 1 i 4 instrukcji, ale możesz także mieć 2 instrukcje() i 3 instrukcje (IT{T,E}{T,E}).

Wreszcie, aby przynieść do domu punkt, dam przykład jak poniższy kod C może być realizowane za pomocą tej instrukcji:

if (R4 == R5) 
{ 
    R7 = R8 + R9; 
    R7 /= 2; 
} 
else 
{ 
    R7 = R10 + R11; 
    R7 *= 2; 
} 

konwertuje do

CMP R4, R5 
ITTEE EQ 
ADDEQ R7, R8, R9 ; if R4 = R5, R7 = R8 + R9 
ASREQ R7, R7, #1 ; if R4 = R5, R7 /= 2 
ADDNE R7, R10, R11 ; if R4 != R5, R7 = R10 + R11 
LSLNE R7, R7, #1 ; if R4 != R5, R7 *=2 

To powinno dać wystarczająco dużo, aby przez chwilę się zżerać.

+4

Niezły przegląd. Niektóre tła dla czytelników, którzy mogą nie być obeznani z ARM: 32-bitowe kody operacyjne ARM miały bitów warunkowych, aby kontrolować, czy kod operacyjny powinien zostać wykonany, czy nie. Gdy pierwotny wariant Thumb został opracowany, nie było miejsca w 16-bitowych opcodes przeznaczonych do bitów warunkowego wykonywania, więc tylko opkody gałęzi miały warunkowe wykonanie (jak wiele innych procesorów). Thumb2 dodał te "kody opcyjne warunkowe", aby umożliwić krótkie sekwencje wykonania warunkowego (tj., Aby zapobiec krótkiemu warunkowemu kodowi od zabicia rurociągu). –

+0

@Michael - doskonały punkt, dziękuję za wzmiankę o tym. – Dan

+0

Świetne wyjaśnienie! Ale co jeśli chcę więcej instrukcji w bloku warunkowym (nie ograniczonym do 4)? Jedynym sposobem jest użycie oddziału? –

3

W prostych słowach ITTE wykonuje następujące 3 wykonanie jako JEŻELI TO {} THEN {} ELSE {} na podstawie powyższej instrukcji cmp.

W architekturach ARMv6T2 i nowszych można użyć instrukcji IT do wykonania warunkowego. W architekturach przed ARMv6T2 nie ma instrukcji IT i dlatego instrukcje Kciuk nie mogą być wykonywane warunkowo, z wyjątkiem instrukcji rozgałęzienia B. Asembler sprawdza instrukcje IT, ale pomija je przy montażu do kodu ARM.

Dla twojego rozwiązania pozwala najpierw zrozumieć składnię prostej instrukcji IT (wprowadzonej w Thumb 2) zespołu ARM, która jest podstawą ITTE.

IT{pattern} {cond}

przypadku, następnie określa warunki realizacji dla maksymalnie czterech następujących instrukcji kombinacja do trzech T (następnie) i E (jeszcze) liter, pierwsza instrukcja po IT zawsze warunek (T) Informacje, które mogą modyfikować licznika programu musi być ostatnim w bloku IT

w then warunkach muszą kod warunku oraz wszelkie else warunki muszą być warunek odwrotnie.Poniższa tabela przedstawia kody stanie i ich przeciwieństwa:

enter image description here

Powiedzmy zrozumieć inną dyspozycję cmp.

CMP Rn, #imm

Rn musi być rejestrem Lo. zakres imm 0-255. Te instrukcje aktualizują flagi N, Z, C i V zgodnie z wynikiem.

Pamiętaj: IT pozwala na cztery następujące instrukcje Thumb (blok IT) być warunkowy lub można powiedzieć tutaj ITTE służy do obsługi małych sekwencje kodu warunkowego, do 4 instrukcji.

Proste przykłady

Ex 1:

cmp r1, #22  Compare r1 value with 22 
IT EQ   Read this as If EQual Then ADD R1,R1,#1 
ADD R1,R1,#1  <- This will only be executed if above r1 value equal to 22(means when z condition flag is equal to 1) 

Ex 2:

cmp r1, #22  Compare r1 value with 22 
ITE EQ   Read this as If EQual Then ADD R1,R1,#1 Else ADD R0,R0,#1 
ADD R1,R1,#1  <- This will only be executed if the Z condition flag is 1 
ADD R0,R0,#1  <- This will only be executed if the Z condition flag is 0 

Co zrobić ITTE? to pytanie tutaj

CMP R1, #22  Compare r1 value with 22 
    ITTE NE   Read this as IF NotEqual Then ADD R1,R1,#1 Then ADD R0,R0,#1 Else ADD R2,R2,#1 
    ADD R1,R1,#1  <- This will only be executed if the Z condition flag is 0 
    ADD R0,R0,#1  <- This will only be executed if the Z condition flag is 0 
    ADD R2,R2,#1  <- This will only be executed if the Z condition flag is 1 

Tutaj ITTE nakłada warunek NE na pierwszych dwóch następujących instrukcji i stanu EQ na następny.

UWAGA: Wszelkie oddziały, które istnieją w bloku musi być ostatnią instrukcję w odniesieniu block.Taken z here poniższym przykładzie będzie o niezdefiniowanej zachowanie, ponieważ instrukcja oddział jest stosowany w środku instrukcji rozgałęzienia.

ite  eq 
blxeq some_label @ UNPREDICTABLE during an IT block. 
movne r0, #0 

poprawny sposób wdrożenia powyższego byłoby umieścić mov przed blx, co następuje:

ite  ne 
movne r0, #0 
blxeq some_label @ Ok at the end of an IT block. 

Aby uzyskać więcej informacji THUMB-2 Instruction set reference manual strona 4-92

IT{x{y{z}}}<q> <Firstcondition> 

<x> warunek dla drugiej instrukcji w bloku IT

<y> warunkiem trzeciej instrukcji w bloku IT

<z> warunek czwarty instrukcji w bloku IT

<q> określa opcjonalnych kwalifikatorów asemblera na polecenie

Dwa kwalifikator zdefiniowane tutaj:

 .N Meaning Narrow. Assembler has to choose 16-bit encoding for the instruction if it is not possible then error. 

     .W Meaning Wide. Assembler has to select 32-bit encoding for the instruction if is not possible then error. 

<Firstcondition> Warunek pierwszej instrukcji w bloku IT, tj. EQ, NE, CC, CS.