1

私はアセンブリを書く経験がまったくないので、この質問に答えるのはかなり簡単だと思います。

この単純なループを持つ:

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

subs r0,r0,#1
bne loop
afterloop:

よく理解できれば、このループは 3 から 0 に減って停止するはずです (間違っていたら訂正してください)。

last-instructionただし、最後の反復で r0 == 0 をスキップしてループから抜けたいと思います。cmpr0 が 0 に等しい場合は、いくつかあるはずだと思いafterloopます。しかし、これを達成するためのより簡単な方法があるかもしれないと思います。

編集: もう 1 つの質問 - スキップする指示がさらにある場合はどうすればよいですか?

C では次のようになります。

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

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

1 に答える 1

4

最後の命令が r0 に依存したり、CPSR を変更したりしない限り、subs行を最後の命令の 1 ステップ前に移動し、最後の命令を 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 では、Intel とは異なり、B(ranch) だけでなく、ほぼすべての命令を条件付きにすることができます。それが実際に親指でない限り。

EDIT re: edit: その方法で複数の命令を条件付きにすることができます。または、ジャンプを使用して同じロジックを複製することもできます。このような:

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 から読み取ると、すでに減少した値が得られます。

于 2013-03-18T21:24:14.113 に答える