2

我正在尝试在程序集中实现一个计数器,除了执行正常任务外,我还想打印计数器。所以如果我的计数器是 10 秒,我想在那 10 秒内执行任务,并打印 10,9,8..等等

我能想到的唯一方法是检查current - starting以毫秒为单位的时间是否是完美的千,例如,10 是 10,000,9 是 9000,等等,然后打印这些数字。

所以我的问题是如何在 ARM 汇编中进行取模函数?我在没有除法指令的 ARMSIM 工作。

它确实有二进制右移和二进制左移、二进制与、异或等有没有办法使用这些操作来实现这一点?

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

二进制奇数的最后一位总是 = 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 回答