[英]Skipping instruction in ARM assembly
我根本沒有寫過大會的經驗,所以我覺得這個問題很容易回答。
有這個簡單的循環:
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;
}
除非最后一個指令取決於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(牧場)。 除非它實際上是拇指。
編輯:編輯:您可以通過這種方式生成多條指令。 或者,您也可以使用跳轉復制相同的邏輯。 像這樣:
mov r0,#3
loop:
do some instructions
...
subs r0,r0,#1
bz afterloop
last-instructions
b loop
afterloop:
這絕對是“英語”式的裝配風格。 有些人聲稱它更容易理解。 對於2-3條條件行,我不會打擾。 對於10歲以上,我願意。 在中間有一個灰色區域。 :)
Bz
和be
是同義詞。 這種邏輯更清晰 - 你隱含地將r0與0進行比較。
在這種情況下,最后的指令可以破壞他們想要的所有標志。 從r0讀取仍然會給你已經減少的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.