2017-10-13 108 views
2

我想知道在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 

感谢您的答案。

+0

如果你想让它快速运行,请查看gcc输出以获取你想要的C函数。它将使用乘法反转来进行除法,在大多数CPU上运行速度比除法快得多。在现代的x86上,乘以+ shift,然后再乘以再除以原来的分红,要比使用硬件'div'指令直接得到余数要快得多。 –

+0

[为什么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编译器。 –

回答

4

DIVU指令完全符合您的要求。当您执行DIVU时,目的地的长字被除以源词。在你的情况,你写道:

DIVU D1, D2 

所以,D2被除以D1。在商中,有两个部分返回。 D2的高位字将包含余数(模数),而低位字包含商。这就是为什么你通常会看到一个SWAP d2。这将其余部分移至低位字。

+0

非常感谢,如何从数据寄存器中清除高位或低位字? – Dartuso

+1

您可以执行以下操作:'CLR.W D2'后跟'SWAP D2',清除低位字(商),然后执行交换。 –