我想知道在Motorola 68000程序集中是否有执行模的命令/方法?68K程序集中的模
我想执行D4国防部1000和D3 MOD 100
目前我使用下面的公式,但这需要几行,
如果一个模N然后 - (N * INT (A/N))
我看到这个公式为D0 D1 MOD
CLR.L D2
MOVE.W D0,D2
DIVU D1,D2
SWAP D2
感谢您的答案。
我想知道在Motorola 68000程序集中是否有执行模的命令/方法?68K程序集中的模
我想执行D4国防部1000和D3 MOD 100
目前我使用下面的公式,但这需要几行,
如果一个模N然后 - (N * INT (A/N))
我看到这个公式为D0 D1 MOD
CLR.L D2
MOVE.W D0,D2
DIVU D1,D2
SWAP D2
感谢您的答案。
DIVU
指令完全符合您的要求。当您执行DIVU
时,目的地的长字被除以源词。在你的情况,你写道:
DIVU D1, D2
所以,D2被除以D1。在商中,有两个部分返回。 D2的高位字将包含余数(模数),而低位字包含商。这就是为什么你通常会看到一个SWAP d2
。这将其余部分移至低位字。
非常感谢,如何从数据寄存器中清除高位或低位字? – Dartuso
您可以执行以下操作:'CLR.W D2'后跟'SWAP D2',清除低位字(商),然后执行交换。 –
如果你想让它快速运行,请查看gcc输出以获取你想要的C函数。它将使用乘法反转来进行除法,在大多数CPU上运行速度比除法快得多。在现代的x86上,乘以+ shift,然后再乘以再除以原来的分红,要比使用硬件'div'指令直接得到余数要快得多。 –
[为什么GCC在实现整数除法时使用奇数乘法](https://stackoverflow.com/questions/41183935/why-does-gcc-use-multiplication-by-a-strange-number-in-implementing -integer-迪维)。当用手写asm时,为自己生成一个常量最简单的方法是将['unsigned foo(unsigned x){return x/1000; }'](https://godbolt.org/g/U4jk3n)或'%'到C编译器。 –