简体   繁体   中英

Modulo in 68K assembly

I was wondering if there is a command/method to perform modulo in Motorola 68000 assembly?

I want to perform d4 mod 1000 and d3 mod 100.

Current I am using the following formula but this take several lines,

if a mod n then a - (n * int(a/n))

I have seen this formula for d0 mod d1

CLR.L D2
MOVE.W D0,D2
DIVU D1,D2
SWAP D2

Thanks for the answers.

The DIVU instruction does precisely what you are looking for. When you perform DIVU , the long word of the destination is divided by the word of the source. In your case, you wrote:

DIVU D1, D2

So, D2 is being divided by D1. In the quotient, there are two parts returned. The high order word of D2 will contain the remainder (the modulus) while the low order word contains the quotient. This is why you typically see a SWAP d2 . This moves the remainder to the low order word.

  1. Perform division, result is quotient in bottom 16 bits, modulus in top 16 bits
  2. Set quotient to zero so...
  3. ..when you swap the modulus it is a valid 32 bit value

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

One thing that this code doesn't handle is whether the result would be larger than #ffff(65535), for which you need extra code, possibly a test to check if D3/D4 is greater than the divisor shifted up by 16 bits.

As the modulus will be a number between 0 and 99/999, you could alternatively use EXT.W after the swap instead of CLR.W before the swap. Note that EXT sign extends a value.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM