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
。这会将余数移至低位字。
- 进行除法,结果低16位为商,高16位为模
- 将商设置为零,这样...
- ..当你交换模数时,它是一个有效的 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 符号扩展了一个值。
我想知道是否有一个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
。这会将余数移至低位字。
- 进行除法,结果低16位为商,高16位为模
- 将商设置为零,这样...
- ..当你交换模数时,它是一个有效的 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 符号扩展了一个值。