2

通常のタスクを実行する以外に、カウンターを印刷したいアセンブリにカウンターを実装しようとしています。したがって、カウンターが 10 秒の場合、その 10 秒でタスクを実行し、10,9,8 などを出力します。

これを行うために私が考えることができる唯一の方法はcurrent - starting、ミリ秒単位の時間が完全な千であるかどうかを確認することです。たとえば、10 の場合は 10,000、9 の場合は 9000 などで、それらの数値を出力します。

私の質問は、ARM アセンブリでモジュラス関数を実行するにはどうすればよいですか? 除算命令のない ARMSIM で作業しています。

バイナリ右シフトとバイナリ左シフト、バイナリAND、XORなどがあります。これらの操作を使用してこれを達成する方法はありますか?

4

3 に答える 3

2

あなたのコードは明らかに、ある時点でタスクを実行し始めます、T.

開始時刻 T がわかっている場合は、それに 1000 を加算するだけで、回答を出力する時刻 U を取得できます。

次に、単純に時間を U と比較します。より大きい場合は、回答を出力し、次に出力する回答の制限として U を U+1000 に設定します。

この本質的なアイデアを使用して、リアルタイム オペレーティング システム用の「タイマー」を作成することがよくあります。

分割は必要ありません:-}

于 2012-07-17T07:16:26.060 に答える
0

まず、これが問題を解決する最良の方法であるとは確信していません。

しかし、1000 を掛けることができれば、1000 で割ることはそれほど難しくありません。二分探索を行ってください。このようなもの:

; Compute x / 1000 by binary search.
lo = x >> 10 ; x / 1024
hi = x >> 9  ; x / 512
while lo < hi 
  mid = (lo + hi) >> 1;
  test = mid * 1000
  if test < x then lo = mid + 1
  else if test > x then hi = mid - 1
  else return mid
end
return hi

この商を使用すると、x - q * 1000 で mod を実行できます。

もちろん、x に 1000 を掛けることは x << 10 - x << 4 - x << 3 です。

于 2012-07-17T06:13:17.830 に答える
-1

2 進数の奇数の最後の桁は常に = 1 であり、3--> 11 5--> 101 7--> 111 となります。

Mov R0,#0x01
Mov R1,#0x23
And R3,R0,R1
CMP R3,#0X01
BEQ ODD
BNE EVEN
于 2016-05-08T05:33:51.107 に答える