2014-09-23 212 views
1

爲什麼下面編譯:ARM IT條件指令彙編器(armcc)


    ITE EQ   
    MRSEQ R0, MSP 
    MRSNE R0, PSP 

但這並不:


    ITT NE
MRSNE R0, PSP
MRSEQ R0, MSP
是否有可能,這兩個MRSNE R0,PSP和MRSEQ R0,MSP執行(這是我的情況) ?

This compiles:

    ITT NE   
    MRSNE R0, PSP  
    MRSNE R0, MSP

它是ARM標準?

+2

難道它不是「ITE NE」而不是「ITT NE」嗎? http://stackoverflow.com/a/7050840/1163019 – auselen 2014-09-23 09:51:56

+0

您是否希望代碼的行爲完全不同取決於您傳遞給彙編器的選項?也許重新閱讀IT的文檔 - 統一的語言明確地強化了ARM(各個指令)的條件與Thumb(IT語法)的條件之間的一致性,以防止這種瘋狂。 – Notlikethat 2014-09-23 11:22:37

回答

7

但這並不:

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的逆條件應用於指令。

爲了支持的Thumb2ARM彙編,創建了一個名爲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塊。

  1. IT塊不應該設置條件代碼。即,cmpne說明。
  2. 您不應分支到IT區塊。
  3. 我們總是從IT開始,因此IT中的條件必須與第一條指令相匹配。
  4. 如果'T'或!cond如果'E',則以下指令必須匹配條件
  5. 你不應該改變狀態寄存器PSRcpsr見注
  6. 只能混合類型相反。例如,

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

+0

請參閱:[Cortex-A程序員指南](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0013d/index.html)。 – 2014-09-23 20:12:36

+0

這個PC日誌證明這兩個指令是否都被執行?:TST.W r14,#0x00000004, ITE NE, MRS.W r0,PSP, MRS.W r0,MSP, – 2014-09-24 11:35:43