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

  1.  
  2. ;    Lezione8p2b.s    estensione del segno nei registri indirizzi
  3.  
  4.     SECTION    CondC,CODE
  5.  
  6. Inizio:
  7.     move.l    #$ffffffff,a0    ; Ossia "move.l #-1,a0"
  8.     move.w    #$51a7,a0
  9. stop:
  10.     rts
  11.  
  12.     end
  13.  
  14. ;            \|/
  15. ;           (©_©)
  16. ;--------ooO-(_)-Ooo--------
  17.  
  18. In questa lezione ci occuperemo di un'altra particolarita` dell'indirizzamento
  19. diretto a registro indirizzi.
  20. Eseguiamo un'istruzione per volta il programma sopra riportato.
  21. La prima MOVE carica un valore di 32 bit in A0.
  22.  
  23. D0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  24. A0: FFFFFFFF 00000000 00000000 00000000 00000000 00000000 00000000 07C9F584
  25. SSP=07CA06B7 USP=07C9F584 SR=8000 T1 -- PL=0 ----- PC=07CA1F8E
  26. PC=07CA1F8E 307C0100         MOVE.W  #$51A7,A0
  27. >
  28.  
  29. Come normale il registro A0 ha assunto il valore $FFFFFFFF. Ora eseguiamo
  30. la seconda MOVE. Notiamo che essa carica un valore a 16 bit in A0.
  31. Ci aspetteremmo che solo la word bassa di A0 venisse modificata.
  32. Invece possiamo verificare che e` stata modificata anche la word alta:
  33.  
  34. D0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  35. A0: 000051A7 00000000 00000000 00000000 00000000 00000000 00000000 07C9F584
  36. SSP=07CA06B7 USP=07C9F584 SR=8000 T1 -- PL=0 ----- PC=07CA1F92
  37. PC=07CA1F92 4E75         RTS
  38. >
  39.  
  40. Questo accade perche` quando si scrive in un registro indirizzi una WORD
  41. (ricordiamo che NON e` possibile scrivere un singolo BYTE, cioe`
  42. l'istruzione  MOVE.B xxxx,Ax NON e` permessa) essa viene trasformata in una
  43. LONG WORD mediante un'operazione detta "estensione di segno" che consiste
  44. nel copiare il bit piu` significativo della WORD (cioe` il bit 15, che come
  45. sapete indica il segno di un valore formato WORD) in tutti i bit della
  46. WORD alta, in modo da conservare lo stesso segno passando dal valore WORD a
  47. quello LONG WORD. In pratica nel nostro caso abbiamo:
  48.  
  49. valore di partenza = $51A7 = %0101000110100111
  50.                   ^
  51.                   |
  52.                   bit piu` significativo vale 0
  53.  
  54. valore esteso = $000051A7  = %00000000000000000101000110100111
  55.  
  56. tutti i bit da 16 a 31 hanno assunto il valore 0.
  57.  
  58. Facciamo un'altro esempio, cambiando i valori caricati dalle MOVE:
  59.  
  60.     move.l    #$22222222,a0
  61.     move.w    #$c1a7,a0
  62.  
  63. Eseguendo la prima MOVE otteniamo:
  64.  
  65. D0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  66. A0: 22222222 00000000 00000000 00000000 00000000 00000000 00000000 07C9F584
  67. SSP=07CA06B7 USP=07C9F584 SR=8000 T1 -- PL=0 ----- PC=07CA2642
  68. PC=07CA2642 307CC1A7         MOVE.W  #$C1A7,A0
  69. >
  70.  
  71. eseguendo la seconda:
  72.  
  73. D0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
  74. A0: FFFFC1A7 00000000 00000000 00000000 00000000 00000000 00000000 07C9F584 
  75. SSP=07CA06B7 USP=07C9F584 SR=8000 T1 -- PL=0 ----- PC=07CA2646
  76. PC=07CA2646 4E75                 RTS
  77.  
  78. In questo caso l'estensione di segno ha reso negativo il valore LONG WORD:
  79.  
  80. Valore di partenza = $C1A7 = %1100000110100111
  81.                   ^
  82.                   |
  83.                   Il bit piu` significativo vale 1
  84. Valore esteso = $FFFFC1A7  = %11111111111111111100000110100111
  85.  
  86. Tutti i bit da 16 a 31 hanno assunto il valore 1.
  87.  
  88. Nota: l'istruzione EXT.L serve ad estendere il segno come in questi esempi.
  89.