2011-08-12 22 views
16

什麼是以下行臂組件做:ITTE在臂組件

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

我得到的第一線(R1相比22)但對於第二行(我從來沒有見過的ITTE命令之前和谷歌搜索沒有返回任何內容)

回答

46

它是ARM的IF -THEN-ELSE指令,它是在Thumb-2指令集中引入的。 (根據上面的具體示例,如果您已經顯示了遵循ITTE指令的接下來的3條指令,您將會明白爲什麼當你完成這個答案時)。用於處理條件碼的小序列,最多4條指令。把它看作是實現ARM條件執行的一種不同方式(例如,BNE--分支指令只在零標誌未被設置時執行)。

它的好處是,它避免了服用一個分支懲罰(想必你已經瞭解管道等)

的指令是有點麻煩,但一旦你環繞它你的頭,這是很優雅。

它的形式如下:

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

其中xy,和z是可選的,而且必須是T(對於 「然後」)或E(爲 「其他」)。 <cond>是反映在APSR標誌中的諸如NEEQGT等的任何條件。

所以,你總是有一個TI(該指令是IT畢竟!),然後0-3 E的或T的。對於每個T和每個E,都必須按照相同順序進行後續指令。每個匹配的後續指令必須具有與IT指令相匹配的條件。

忍受着我,我知道這很混亂。我將舉幾個例子來說明。

指令的最小形式會是這樣的:

IT LT 
SUBLT.W R2, R1 

在這種情況下,如果LT爲真(每APSR標記),減法會發生。請注意,SUB中的LTIT指令中的LT相匹配。

一個完全成熟的例子是這樣的:

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

因此,我們必須THEN ELSE THEN THEN(TETT),與NE條件。請注意以下4條條件指令(4條指令,TETT各1條),「THEN」指令的條件爲NE,「ELSE」指令(IT指令後的第2條指令 - 請記住E是第2條4 E's和T's)具有相反的條件。它不能是其他任何東西,即如果它是類似於LT而不是EQ那樣將是錯誤的。 EQNE相反。

因此,如果NE爲真,則將執行指令1,3和4。否則(EQ),只執行指令2(ADDEQ)。

我已經給出了1和4指令的例子,但你也可以有2 (IT{T,E})和3指令(IT{T,E}{T,E})的形式。

最後,要帶回家的一點,我給的是如何下面的C代碼可以使用此指令來實現的例子:

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

轉換爲

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 

這應該給你足夠咀嚼一段時間。

+4

不錯的概述。一些讀者可能不熟悉ARM的背景知識:32位ARM操作碼每個都有條件位來控制操作碼是否應該執行。當開發原始的Thumb變體時,16位操作碼中沒有空間專門用於條件執行位,所以只有分支操作碼具有條件執行(像很多其他CPU一樣)。 Thumb2添加了這些'條件操作碼'以允許條件執行的短序列(即,防止短條件碼序列殺死流水線)。 –

+0

@邁克爾 - 優點,謝謝你提到。 – Dan

+0

很好的解釋!但是如果我在條件塊中需要更多指令(不限於4)呢?唯一的方法是使用分支? –

3

簡單地說,ITTE執行以下3次執行,如IF THEN {} THEN {} ELSE {}基於上述cmp指令。

在ARMv6T2和更高版本的體系結構中,可以使用IT指令進行條件執行。在ARMv6T2之前的體系結構中,沒有IT指令,因此除了B分支指令外,Thumb指令不能有條件地執行。彙編程序會檢查IT指令,但在彙編到ARM代碼時忽略它們。

對於您的解決方案,首先了解基於ITTE的ARM程序集的簡單IT指令(在Thumb 2中引入)的語法。

IT{pattern} {cond}

IF-THEN,設置了多達4以下說明 的執行條件可多達三個T(然後)和E(否則)字母的任意組合,所述第一指令以下是總是cond(T)可以修改程序計數器的指令必須在最後一個IT塊中

條件必須與條件碼匹配,並且任何else條件必須是相反的條件。下表顯示了條件代碼和他們的對立面:

enter image description here

我們先來了解另一個cmp指令。

CMP Rn, #imm

Rn必須是Lo寄存器。免疫範圍0-255。 這些指令根據結果更新N,Z,C和V標誌。

記住:IT允許一個以下四個Thumb指令(IT塊)是有條件的,也可以說這裏ITTE用於處理的條件代碼序列小,達4條指令。

簡單的例子

例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) 

出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 

ITTE做什麼?在這裏

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 

這裏ITTE你的問題規定如下指令,並在旁邊的均衡條件上,前兩個是NE的條件。

注:存在於IT塊任何分支機構必須在block.Taken參考的最後一個指令從here 下面的例子將是因爲分支指令的分支指令的中間使用具有不確定的行爲。

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

正確的方式上面會放MOV的BLX之前,如下所示:

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

欲瞭解更多信息THUMB-2 Instruction set reference manual頁4-92

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

<x> IT塊中第二條指令的條件

<y>條件第三指令在IT阻塞第四指令

<z>條件在IT方框

<q>指定定義

兩個限定符在這裏的指令可選彙編限定符:

 .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> IT塊中第一條指令的條件,即EQ,NE,CC,CS。