每1000个定时器计数的多个打印一个计数器,没有硬件除法指令?

时间:2012-07-17 05:51:54

标签: assembly binary arm modulo

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

我能想到的唯一方法就是检查current - starting时间(以毫秒为单位)是否为完美千分之一,例如,10为10,000,9000为9等,并打印这些数字。< / p>

所以我的问题是我如何在ARM汇编中执行模数函数? 我在ARMSIM工作,没有分工指导。

它有二进制右移和二进制左移,二进制AND,XOR等 有没有办法使用这些操作实现这一目标?

3 个答案:

答案 0 :(得分:2)

您的代码显然会在某个时刻开始执行您的任务,T。

如果您知道开始时间T,您只需添加1000即可获得打印答案时的时间U.

然后简单地将时间与U进行比较。如果更大,则打印答案,并将U设置为U + 1000作为下一个要打印的答案的限制。

人们经常建立&#34;计时器&#34;使用这个基本想法的实时操作系统。

不需要分组: - }

答案 1 :(得分: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&lt;&lt; 10-x&lt;&lt; 4 - x&lt;&lt; 3

答案 2 :(得分:-1)

二进制中奇数的最后一位数总是= 1,这样3 - > 11 5 - &gt; 101 7 - &gt; 111 所以假设:

Mov R0,#0x01
Mov R1,#0x23
And R3,R0,R1
CMP R3,#0X01
BEQ ODD
BNE EVEN