2013-03-18 118 views
1

我在編寫Assembly時沒有經驗,所以我有這個相當容易回答的問題。在ARM程序集中跳過指令

有了這個簡單的循環:

mov r0,#3 
loop: 
    do some instructions 
    ... 
    last-instruction 

subs r0,r0,#1 
bne loop 
afterloop: 

如果我沒有理解好了,這個循環應該減少3至0並停止(糾正我,如果我錯了)。

但是,在上一次迭代中,當r0 == 0時,我想跳過last-instruction並退出循環。如果r0等於0,我認爲必須有一些cmp,然後跳轉到afterloop。但我想可能有一些更簡單的方法來實現這一點。

編輯: 還有一個問題 - 如果有更多的指令要跳過?

在C它是這樣的:

int i = 3; 
while (1) { 
    foo(); 

    if (i == 0) break; 
    skipped_func(); 
    --i; 
} 
+0

請使用僞代碼重新編寫您的問題或代碼,該代碼非常清楚您想要在循環中執行什麼操作 – 2013-03-18 21:24:11

回答

4

除非最後一條指令依賴於R0和/或修改CPSR,將最後的指令之前,subs線的步驟並進行最後的指令條件與一個NE的情況。就像這樣:

mov r0,#3 
loop: 
    do some instructions 
    ... 


    subs r0,r0,#1 
    last-instructionNE 
bne loop 
afterloop: 

如果最後的指令是mov,使它成爲一個movne。如果一個str,使其成爲strne。等等。

如果最後一條指令已經有一個「s」後綴,它將不起作用 - 修改標誌。如果是這樣,它將毀掉零標誌,並且bne將無法​​按預期工作。另外,如果最後的指令在減少之前依賴於r0的值,則它也必須在subs之前執行。

在ARM上,與英特爾不同,幾乎所有指令都可以作爲條件,而不僅僅是B(牧場)。除非它實際上是Thumb。

編輯re:編輯:你可以使多個指令有條件的這種方式。或者,您也可以使用跳轉來複制相同的邏輯。像這樣:

mov r0,#3 
loop: 
    do some instructions 
    ... 
    subs r0,r0,#1 
    bz afterloop 

    last-instructions 
b loop 
afterloop: 

這是決定性的「Intelish」風格的組裝。有些人認爲它更容易理解。對於2-3條有條件的行,我不會打擾。對於10+,我會的。中間有一個灰色區域。 :)

Bzbe是同義詞。這種邏輯更清晰 - 你隱式將r0與0進行比較。

在這種情況下,最後的指令可能會毀掉所有他們想要的標誌。從r0讀取仍然會給你已經減少的值。

+0

好的,如果還有更多的指令,我需要使每條條件都有條件? – NumberFour 2013-03-18 21:26:46

+0

您可以在您的答案中的示例中顯示此跳轉邏輯嗎?謝謝! – NumberFour 2013-03-18 21:31:31

+0

而在Thumb2中,您可以使用IT *指令獲取條件。 – nneonneo 2013-03-19 00:32:51