2013-11-05 112 views
1

我對ARM非常陌生,並且正在爲類進行分配。 我感到困惑的是雙重條件,如果(x> 0 & & x < 100)做某事。ARM彙編中的雙重條件

我想要做的是檢查是否在地址內存中,如果信息是大寫或小寫字符。

我在這裏找到了一個鏈接,但它不適用於ARM,似乎並不能幫助我。

我想是這樣的:

BGT r2, #0x60

BLT r2, #0x7B

但被亂扔所以我假設你不能值比較挺直爲int期待地址表達式錯誤。

編輯,固定我的病情,打字速度過快,把錯誤的GT LT箭頭

+0

OK,所以如果你知道如何做一個單一的條件,你可以重寫你的條件,如'if(x> 0){if(x <100){/ * code here * /}}' – Blorgbeard

+0

一個,兩個,三個或十幾個連續的條件,它們都實現相同的條件。一次只做一個,不要擔心技巧做多個(當然除了大於或等於類型的東西,這實際上是一個單一的條件)。 –

+0

更重要的問題與管理unsigned vs signed有關,這是困難的(er)部分,更可能做錯。 –

回答

2

你不能在一條指令中進行比較和分支。您需要使用單獨的比較和分支指令。 (ARM確實有一個「零比較和分支」,但在這裏並不適用。)

你想要更多的東西一樣:

CMP r2, #100 
    BGT label_out 
    CMP r2, #0 
    BLT label_out 

... do stuff 

label_out: ; the branches come here if R2 < 0 || R2 > 100 
+0

如果我希望它只在其&&而不是||時才轉到label_out,我該如何使用它? –

+0

我寫了關於另一個處理器的彙編語言條件分支的大量教程:http://wiki.intellivision.us/index.php?title=Introducing_the_Instruction_Set_Part_3 事實證明,ARM彙編語言和該處理器的彙編語言是非常相似。只需在大部分地方用'CMP'替換CMPR和CMPI,然後交換參數順序(即將#123,R2更改爲R2,#123)。否則,這些基本原則都是一樣的。 –

+0

您可能想跳轉到'If-Then'部分:http://wiki.intellivision.us/index.php?title=Introducing_the_Instruction_Set_Part_3#If- Then 對於您的化合物&&條件,您想要跳到如果任一條件測試錯誤,則'else'。對於複合||條件,如果任何一個條件都是真的,你想跳到'then'。 –

1

我感到困惑的是雙重條件。 ..

您可以使用帶有優化的編譯器和反彙編器來查看它是如何實現它的。使用GNU工具,這是gccobjdump -S

如果(X> 0 & & X < 100)

需要彙編來檢查這兩個條件,並設置一個標誌。說價值x是在r0

sub r1, r0, #1 ; change zero test to minus. 
    cmp r1, #98  ; allow equal. 
    ; condition 'ls' (lower and same) for true 
    movls r2, #42  ; set r2 to 42 if(x > 0 && x < 100) 
    ; condition 'hi' (high unsigned) opposite flags 
    movhi r2, #24 

這是典型的任何CPU。編譯器將測試轉換爲更好地映射到底層指令集的東西。你的示例測試有不同的操作符。

這是比較容易理解一些代碼,需要較少的概念,

if(x > 0 && y > 0) 

這意味着的東西在彙編更加直截了當,

cmp r0, #0 
    cmpgt r1,#0 
    movgt r0,#42 ; condition passed (here with signed conditions). 

更直線前進,如果測試是在這些情況下,與條件代碼相同的條件(通常是相同的'C'運算符)允許進行條件比較。

+0

thumb的典型規則 ARM是約三個條件指令大約等於一個分支。主動分析總是更好。 –