簡體   English   中英

ARM程序集中的跳過指令

[英]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歲以上,我願意。 在中間有一個灰色區域。 :)

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

在這種情況下,最后的指令可以破壞他們想要的所有標志。 從r0讀取仍然會給你已經減少的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM