我想知道是否有一个命令/方法在Motorola 68000程序集中执行模数?
我想执行d4 mod 1000和d3 mod 100。
目前我正在使用以下公式,但这需要几行,
如果一个mod n则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
的原因。这会将余数移到低位字。
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符号会扩展一个值。