2017-10-13 105 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',清除低位字(商),然後執行交換。 –