home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti4 / lezione8p1b.s < prev    next >
Text File  |  1995-09-29  |  3KB  |  82 lines

  1.  
  2. ; Lezione8p1b.s        Funzionamento dei Condition Codes con le MULU/MULS
  3.  
  4.     SECTION    CondC,CODE
  5.  
  6. ;     oO 
  7. ;     C _
  8. ;    \__/
  9. ;      U 
  10.  
  11. Inizio:
  12.     move.l    #$0003,d0    ; Sarebbe piu' veloce un "moveq #3,d0"...
  13.     move.l    #$c000,d1
  14.     muls.w    d0,d1
  15.  
  16.     moveq    #3,d0        ; Qua lo abbiamo usato... vah!
  17.     move.l    #$c000,d1
  18.     mulu.w    d0,d1
  19. stop:
  20.     rts
  21.  
  22.     end
  23.  
  24. Vediamo ora un esempio d'uso delle istruzioni di moltiplicazione.
  25. Il 68000 ci mette a disposizione 2 diverse istruzioni di moltiplicazione:
  26. MULS moltiplica 2 numeri considerandoli come numeri in complemento a 2,
  27. mentre MULU considera i numeri da moltiplicare sempre positivi.
  28. Muls/Divs lavorano con numeri in complemento a due mentre Mulu/Divu usano
  29. numeri senza segno.
  30.  
  31.     MULU    <ea>,Dn         Sorgente=Dati    Destinazione=Dn
  32.     MULS    <ea>,Dn         Sorgente=Dati    Destinazione=Dn
  33.  
  34. E' possibile moltiplicare solo numeri a 16 bit (in formato di word) e
  35. il prodotto a 32bit (formato di longword) e' fornito in un registro dati.
  36. Ovviamente i risultati che si ottengono con MULU o MULS sono molto diversi.
  37. Facciamo un esempio moltiplicando $c000 per $0003.
  38.  
  39. D0: 00000003 0000C000 00000000 00000000 00000000 00000000 00000000 00000000 
  40. A0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 07D32154 
  41. SSP=07D33287 USP=07D32154 SR=8000 T1 -- PL=0 ----- PC=07D34CEC
  42. PC=07D34CEC C3C0         MULS.W  D0,D1
  43. >
  44.  
  45. La MULS considera $c000 come un numero negativo.
  46. Il risultato che ottiene e` il seguente:
  47.  
  48. D0: 00000003 FFFF4000 00000000 00000000 00000000 00000000 00000000 00000000
  49. A0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 07D32154
  50. SSP=07D33287 USP=07D32154 SR=8008 T1 -- PL=0 -N--- PC=07D34CEE
  51. PC=07D34CEE 203C00000003     MOVE.L  #$00000003,D0
  52. >
  53.  
  54. Il risultato e` negativo (infatti abbiamo moltiplicato un numero positivo per
  55. un negativo) e pertanto il flag N vale 1.
  56. Ricordo agli ignoranti che se si moltiplicano due numeri positivi tra loro il
  57. risultato e' positivo, allo stesso modo se si moltiplicano 2 numeri negativi
  58. tra loro il risultato e' positivo. Invece se si moltiplica un numero negativo
  59. per uno positivo, o uno positovo per uno negativo, il risultato e' negativo.
  60. In sintesi:     + * + = +       - * - = +       + * - = -       - * + = -
  61. Vediamo ora come si comporta la MULU, che considera $c000 come un numero
  62. positivo.
  63.  
  64. D0: 00000003 0000C000 00000000 00000000 00000000 00000000 00000000 00000000
  65. A0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 07D32154
  66. SSP=07D33287 USP=07D32154 SR=8000 T1 -- PL=0 ----- PC=07D34CFA
  67. PC=07D34CFA C2C0         MULU.W  D0,D1
  68. >
  69.  
  70. Il risultato che si ottiene e` il seguente:
  71.  
  72. D0: 00000003 00024000 00000000 00000000 00000000 00000000 00000000 00000000
  73. A0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 07D32154
  74. SSP=07D33287 USP=07D32154 SR=8000 T1 -- PL=0 ----- PC=07D34CFC
  75. PC=07D34CFC 4E75         RTS
  76. >
  77.  
  78. Come potete vedere esso e` molto diverso. Tra l'altro e` positivo, e infatti
  79. il flag N vale 0. Quindi anche per quanto riguarda le moltiplicazioni si deve
  80. scegliere con attenzione l'istruzione da impiegare.
  81.  
  82.