2016-04-11 20 views
2

我在圍繞IT指令(如果有的話)的功能上纏着我的頭。該quick reference card有這樣的:ARM7 IT(如果有)指令真的在做什麼?

操作:IF-THEN
彙編:IT{pattern} {cond}
行動:讓多達四個以下指令的條件,根據圖案。模式是最多三個字母的字符串。每個字母可以是T(Then)或E(Else)。 IT之後的第一條指令具有條件cond。如果相應的字母是T,則以下指令具有條件cond;如果相應的字母是E,則條件cond相反。

實際上,該大綱有一定意義。架構manual entry並沒有讓我在任何地方瞭解:

If-Then條件指令。
語法

IT {X {Y {Z}}} COND

其中: x 指定在IT塊中的第二指令的條件開關。
y 指定IT塊中第三條指令的條件開關。
z 指定IT塊中第四條指令的條件開關。
cond 指定IT塊中第一條指令的條件。

在IT塊中的第二,第三和第四指令的條件開關可以是:
T 然後。將條件cond應用於指令。
E 其他。將cond的反向條件應用於指令。

有可能在一個IT指令使用AL(總是條件)COND。如果這樣做,則IT塊中的所有指令必須是無條件的,並且x,y和z中的每一個必須是T或省略但不是E。 操作

IT指令最多組成四條指令有條件的。條件可以完全相同,或者其中一些可以是其他條件的邏輯反向。 IT指令後的條件指令構成IT塊。

IT塊中的指令(包括任何分支)必須在其語法的{cond}部分中指定條件。

由於(大多數)每條指令都可以很容易地指定一個條件,所以IT指令有什麼好處?

+3

_「由於(最)每條指令可以很容易地指定條件」 _ - 在ARM編碼,是的。你確實意識到大多數的Thumb編碼甚至沒有空間去編碼4位寄存器指定符,更不用說條件碼了,對嗎? – Notlikethat

+0

另請參見:[arm it條件指令彙編程序armcc](http://stackoverflow.com/questions/25991476/arm-it-conditional-instruction-assembler-armcc) –

+0

另請參見:[ARM彙編程序類型上的Ubuntu Wiki]( https://wiki.ubuntu.com/ARM/Thumb2PortingHowto#Types_of_Assembly_Language) –

回答

5

請注意,大多數指令都可以在ARM指令中指定條件碼,而不是在Thumb中。

使用IT指令,您可以指定最多4條指令的條件代碼。對於每條指令,您都指定它是否爲If(T)或Else(E)的一部分。

例如:

ITTET EQ 
ADD r0,r0,r0 
ADD r1,r0,r0 
ADD r2,r0,r0 
ADD r3,r0,r0 

真要翻譯成:

ADDEQ r0,r0,r0 (Always if for 1st one) 
ADDEQ r1,r0,r0 (T for 2nd one) 
ADDNE r2,r0,r0 (E for 3rd one) 
ADDEQ r3,r0,r0 (T for 4th one) 
+0

啊,所以這在Thumb模式下最有用。它是否也跟隨它在ARM模式中沒有那麼有用? – wallyk

+2

它不存在於ARM中,僅在Thumb中。在ARM中,可以爲大多數指令指定條件。 – Dric512

+0

感謝您的快速回復和解釋! – wallyk

4

什麼IT實際上確實encode 8 bits of information into the ITSTATE field of the CPSR非常巧妙。原來的Thumb指令集沒有除分支以外的條件指令,因爲在16位中沒有足夠的空間來容納4位條件代碼,而足以使用足夠的操作碼和操作數。 Thumb-2擴展的作用是將改進爲對那些現有的16位編碼以及新的32位編碼進行條件執行。

如果你看看ARM的條件代碼,你會注意到3個最重要的位表示一個特定的標誌測試,而lsb表示一個解釋或其完全相反 - 原來甚至0xF是一個「從不」對應到0xE的'始終' - 所以你可以將基本條件編碼爲3位,並使用其他5編碼爲下一條指令評估測試的方式,加上一個停止位以指示剩餘條件的指令數量。因此,在完全使用ITSTATE值之前,可將ITSTATE值解壓縮爲ARM條件代碼,並將其與Thumb指令編碼一起送入管道中,並將其解壓縮爲等效的ARM指令。

從架構的角度來看,這是一個很酷的功能,但是編譯器的工程師和CPU設計師可能不同意;)