我想知道在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編譯器。 –