【问题标题】:Print a counter every multiple of 1000 timer counts, with no hardware division instruction?每 1000 个定时器计数的倍数打印一个计数器,没有硬件除法指令?
【发布时间】:2012-07-17 05:51:54
【问题描述】:

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

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

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

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

【问题讨论】:

标签: assembly binary arm modulo


【解决方案1】:

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

如果你知道开始时间 T,你可以简单地加上 1000 来得到你应该打印答案的时间 U。

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

人们经常使用这个基本思想为实时操作系统构建“计时器”。

不需要除法:-}

【讨论】:

    【解决方案2】:

    嗯,首先我不相信这是解决问题的最佳方法。

    但是如果你能乘以 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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • OP 不是在问0b1000,而是在问十进制 1000。这是一个糟糕的问题标题。顺便说一句,第二个分支应该是无条件的,或者不存在。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      相关资源
      最近更新 更多