但這並不:
ITT NE
MRSNE R0, PSP
MRSEQ R0, MSP
首先,你有一些概念問題。什麼是ITT
?首先是一些歷史。早期的ARM CPU不支持Thumb(16bit),也不支持Thumb2(混合16/32位)編碼。對於純ARM,大部分(4個前導位)專用於條件執行。 Thumb指令集不支持條件執行。對於Thumb2(您在Cortex-M部件上需要的),在條件執行上存在變化。指令中不會編譯每條指令的條件,而是在條件寄存器中設置8位的指令。
it
指令給出了一個測試比較(EQ
,NE
,LO
等)。然後它放棄四個條件指示。從皮質-A程序員手冊,
第A.1.34
IT(IF-THEN)使得多達以下說明的條件(稱爲IT
塊)。條件可以全部相同,或者有些可以是其他條件的邏輯逆。 IT
是ARM狀態下的僞指令。
語法:IT{x{y{z}}} {cond}
其中:COND是一個條件碼。請參見第6.1.2節,它指定了IT塊中第一條指令的條件。
X,ÿ和ž指定在IT
塊中的第二,第三和第四指令的條件開關,例如,ITTET
。 條件開關可以是:
- T(Then),它將條件cond應用於指令。
- E(Else),它將cond的逆條件應用於指令。
爲了支持的Thumb2和ARM彙編,創建了一個名爲unified assembler language新模式。 Ref:Unified Syntax
對於純ARM,IT
評估爲空。說明用條件編碼。對於Thumb2,它填充條件寄存器來設置條件位。 ARM彙編器有三種模式; .arm
,.thumb
和.unified
。還有.code 32
和.code 16
。根據使用的模式和特定的彙編程序(Gnu,ARM等),您將得到不同的警告和/或錯誤。然而,這種格局將永遠不會失敗您的序列,
ITE NE ; first NE, 2nd !NE = EQ (Thumb2) MRSNE R0, PSP ; first NE (ARM) MRSEQ R0, MSP ; 2nd !NE = EQ (ARM)
的MRS
指令是 'IT塊'。在你的情況下,你使用thumb2特殊寄存器,所以統一語法對於手頭的任務沒有多大意義。見下面的註釋。
您應該注意一些規則來製作統一的IT
塊。
IT
塊不應該設置條件代碼。即,cmpne
說明。
- 您不應分支到
IT
區塊。
- 我們總是從
IT
開始,因此IT
中的條件必須與第一條指令相匹配。
- 如果'T'或!cond如果'E',則以下指令必須匹配條件。
- 你不應該改變狀態寄存器
PSR
,cpsr
等見注
- 只能混合類型相反。例如,
movlo r1, #-1 moveq r1, #0 movhi r1, #1
會在ARM工作,但不是的Thumb2。在你的情況下,你違反了規則'4',並得到一個錯誤。
實施例:
.text
.syntax unified
ITE NE @ first NE, 2nd !NE = EQ (Thumb2)
movne R0, #1 @ first NE (ARM)
moveq R0, #2 @ 2nd !NE = EQ (ARM)
拆解ARM,
00000000 <.text>:
0: 13a00001 movne r0, #1
4: 03a00002 moveq r0, #2
拆解的Thumb2,
00000000 <.text>:
0: bf14 ite ne
2: 2001 movne r0, #1
4: 2002 moveq r0, #2
對於的Thumb2,這是沒有ITE
指令等效,
00000000 <.text>:
0: 2001 movs r0, #1
2: 2002 movs r0, #2
即,兩個移動設置條件碼。解散器中的第二個數字當然是機器碼。對於thumb2 OS/scheduler,它將恢復條件寄存器,恢復IT
狀態,並且您可以將輸入到IT
塊的中間。也可以手動執行此操作(但是,它可能是高度CPU特定的,並且沒有記錄我知道的)。
注:對於其改變PSR
的Cortex-M調度代碼,你需要使用分支。這些寄存器正在控制IT
塊的執行。您不應修改IT
區塊中的PSR
。這同樣適用於任何上下文恢復指令;我不是100%熟悉Cortex-M模式切換,其中涉及更改活動PSR
。
難道它不是「ITE NE」而不是「ITT NE」嗎? http://stackoverflow.com/a/7050840/1163019 – auselen 2014-09-23 09:51:56
您是否希望代碼的行爲完全不同取決於您傳遞給彙編器的選項?也許重新閱讀IT的文檔 - 統一的語言明確地強化了ARM(各個指令)的條件與Thumb(IT語法)的條件之間的一致性,以防止這種瘋狂。 – Notlikethat 2014-09-23 11:22:37