68K 汇编中的模数

Modulo in 68K assembly

我想知道是否有一个command/method可以在摩托罗拉68000组装中执行modulo?

我想执行 d4 mod 1000 和 d3 mod 100。

目前我正在使用以下公式,但这需要几行,

if a mod n then a - (n * int(a/n))

我看过 d0 的这个公式 mod d1

CLR.L D2
MOVE.W D0,D2
DIVU D1,D2
SWAP D2

感谢您的回答。

DIVU 指令正是您要查找的内容。当您执行 DIVU 时,目标的长字除以源的字。在你的情况下,你写道:

DIVU D1, D2

因此,D2 除以 D1。在商中,返回了两部分。 D2 的高位字将包含余数(模数),而低位字包含商。这就是为什么您通常会看到 SWAP d2。这会将余数移至低位字。

  1. 进行除法,结果低16位为商,高16位为模
  2. 将商设置为零,这样...
  3. ..当你交换模数时,它是一个有效的 32 位值

START
       DIVU  #1000,D4
       CLR.W D4             ; delete quotient
       SWAP  D4             ; modulus from top to bottom 16 bits

       DIVU  #100,D3
       CLR.W D3             ; delete quotient
       SWAP  D3             ; modulus from top to bottom 16 bits

此代码无法处理的一件事是结果是否会大于#ffff(65535),为此您需要额外的代码,可能是检查 D3/D4 是否大于除数向上移动 16 位。

由于模数将是 0 到 99/999 之间的数字,您也可以在交换之后使用 EXT.W 而不是交换之前的 CLR.W交换。请注意,EXT 符号扩展了一个值。