我對ARM非常陌生,並且正在爲類進行分配。 我感到困惑的是雙重條件,如果(x> 0 & & x < 100)做某事。ARM彙編中的雙重條件
我想要做的是檢查是否在地址內存中,如果信息是大寫或小寫字符。
我在這裏找到了一個鏈接,但它不適用於ARM,似乎並不能幫助我。
我想是這樣的:
BGT r2, #0x60
BLT r2, #0x7B
但被亂扔所以我假設你不能值比較挺直爲int期待地址表達式錯誤。
編輯,固定我的病情,打字速度過快,把錯誤的GT LT箭頭
我對ARM非常陌生,並且正在爲類進行分配。 我感到困惑的是雙重條件,如果(x> 0 & & x < 100)做某事。ARM彙編中的雙重條件
我想要做的是檢查是否在地址內存中,如果信息是大寫或小寫字符。
我在這裏找到了一個鏈接,但它不適用於ARM,似乎並不能幫助我。
我想是這樣的:
BGT r2, #0x60
BLT r2, #0x7B
但被亂扔所以我假設你不能值比較挺直爲int期待地址表達式錯誤。
編輯,固定我的病情,打字速度過快,把錯誤的GT LT箭頭
你需要使用BLT或BGT之前進行比較。此線程:ARM Assembler - How do I use CMP, BLT and BGT?似乎有你正在尋找的答案。
你不能在一條指令中進行比較和分支。您需要使用單獨的比較和分支指令。 (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
如果我希望它只在其&&而不是||時才轉到label_out,我該如何使用它? –
我寫了關於另一個處理器的彙編語言條件分支的大量教程:http://wiki.intellivision.us/index.php?title=Introducing_the_Instruction_Set_Part_3 事實證明,ARM彙編語言和該處理器的彙編語言是非常相似。只需在大部分地方用'CMP'替換CMPR和CMPI,然後交換參數順序(即將#123,R2更改爲R2,#123)。否則,這些基本原則都是一樣的。 –
您可能想跳轉到'If-Then'部分:http://wiki.intellivision.us/index.php?title=Introducing_the_Instruction_Set_Part_3#If- Then 對於您的化合物&&條件,您想要跳到如果任一條件測試錯誤,則'else'。對於複合||條件,如果任何一個條件都是真的,你想跳到'then'。 –
我感到困惑的是雙重條件。 ..
您可以使用帶有優化的編譯器和反彙編器來查看它是如何實現它的。使用GNU工具,這是gcc
和objdump -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'運算符)允許進行條件比較。
thumb的典型規則 ARM是約三個條件指令大約等於一個分支。主動分析總是更好。 –
OK,所以如果你知道如何做一個單一的條件,你可以重寫你的條件,如'if(x> 0){if(x <100){/ * code here * /}}' – Blorgbeard
一個,兩個,三個或十幾個連續的條件,它們都實現相同的條件。一次只做一個,不要擔心技巧做多個(當然除了大於或等於類型的東西,這實際上是一個單一的條件)。 –
更重要的問題與管理unsigned vs signed有關,這是困難的(er)部分,更可能做錯。 –