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

  1.  
  2. ; Lezione8p6.s    Funzionamento dei Condition Codes con l'istruzione ADD
  3.  
  4.     SECTION    CondC,CODE
  5.  
  6. Inizio:
  7.     move.w    #$4000,d0
  8.     move.w    #$2000,d1
  9.     add.w    d0,d1
  10.     move.w    #$e000,d0
  11.     move.w    #$b000,d1
  12.     add.w    d0,d1
  13.     move.w    #$6000,d0
  14.     move.w    #$5000,d1
  15.     add.w    d0,d1
  16.     move.w    #$9000,d0
  17.     move.w    #$a000,d1
  18.     add.w    d0,d1
  19. stop:
  20.     rts
  21.  
  22.     end
  23.  
  24.  
  25. L'istruzione ADD influenza i codici condizione cosi':
  26.  
  27. 1) Bit0, Carry (C): e' posto a 1 se il risultato non puo' essere contenuto
  28.    nell'operando destinazione.
  29.    Esempio: (si assume che i numeri siano senza segno.)
  30.  
  31.     move.w    #$7001,d0    ; d0=$7001
  32.     add.w    #$8fff,d0    ; d0=$7001+$8fff=$10000
  33.  
  34.   Come si puo' vedere il risultato dell'addizione non puo' essere contenuto in
  35.   una word in quanto servirebbero 17 bit, il flag C viene settato.
  36.  
  37. 2) Bit1, Overflow (V): Il bit e' posto a 1 solo se l'addizione di due numeri
  38.    con lo stesso segno supera come risultato il campo in complemento a 2
  39.    dell'operando (per es. nel caso di operandi WORD V vale 1 se il risultato
  40.    e` maggiore di 32767 oppure se e` minore di -32768)
  41.    Esempio: (numeri con segno)
  42.  
  43.     move.w    #$7fff,d0    ; d0=$7fff
  44.     addq.w    #$1,d0        ; d0=$7fff+1=$8000=-32768 !!!!!
  45.  
  46.   in questo caso il bit di Overflow viene settato.
  47.  
  48. 3) Bit2, Zero (Z): Il bit e' posto a 1 se il risultato dell'operazione e' zero.
  49. 4) Bit3, Negativo (N): Il bit e' posto a 1 se l'ultima operazione ha prodotto
  50.    un risultato negativo.
  51. 5) Bit4, Extend (X): assume lo stesso stato del bit C
  52.  
  53. V ed N hanno senso solo se si sommano numeri con segno.
  54.  
  55. N.B.: Se le operazioni hanno come operando destinazione un registro indirizzi,
  56. i codici condizione rimangono INVARIATI!!!!
  57. Questa e' una variazione dell'istruzione ADD, ed e' chiamata add address ADDA.
  58. -------------------------------------------------------------------------------
  59.  
  60. Ora verifichiamo la teoria.
  61. Eseguiamo i primi 2 passi del programma: si tratta di 2 MOVE che hanno
  62. come effetto quello di caricare i 2 valori che vogliamo sommare in 2
  63. registri. Si tratta di 2 valori positivi.
  64.  
  65. D0: 00004000 00002000 00000000 00000000 00000000 00000000 00000000 00000000
  66. A0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 07CA4754
  67. SSP=07CA5887 USP=07CA4754 SR=8000 T1 -- PL=0 ----- PC=07CA7A74
  68. PC=07CA7A74 D240         ADD.W   D0,D1
  69. >
  70.  
  71. Eseguiamo la somma. Come potete verificare "a mano", questa somma non genera
  72. riporti, ovvero il risultato ($6000) e` un numero minore di $7fff, e pertanto
  73. puo` essere contenuto ancora in una word. Quindi i flag C,X e V vengono
  74. azzerati. Inoltre anche Z ed N vengono azzerati, perche` $6000 e` positivo e
  75. diverso da zero.
  76.  
  77. D0: 00004000 00006000 00000000 00000000 00000000 00000000 00000000 00000000 
  78. A0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 07CA4754 
  79. SSP=07CA5887 USP=07CA4754 SR=8000 T1 -- PL=0 ----- PC=07CA7A76
  80. PC=07CA7A76 303CE000         MOVE.W  #$E000,D0
  81. >
  82.  
  83. Facciamo ora una somma tra $e000 e $b000. In questo caso abbiamo a che fare
  84. con numeri negativi. Il risultato (che potete verificare a mano)
  85. e` $9000=-28672 che e` maggiore di -32768 e quindi non da problemi, per cui
  86. il flag V vale zero.
  87. Notate pero` che volendo potremmo considerare i nostri 2 numeri come positivi
  88. tralasciando il segno. In questo caso, cioe`, le nostre word assumerebbero
  89. valori compresi tra 0 e 65535. In questo caso, il risultato che otteniamo,
  90. cioe` $9000 non e` ovviamente corretto. Cio` accade perche` il risultato esatto
  91. di $e000+$b000 (considerarti come positivi) sarebbe $19000=102400, cioe` un
  92. numero maggiore di 65535 che avrebbe bisogno di 17 bit per essere
  93. rappresentato correttamente.
  94. Il 68000, per ovviare a questo problema, memorizza il 17-esimo bit nel Carry,
  95. (e anche in X) che quindi assume valore 1. Notate inoltre che siccome $9000
  96. e` negativo (considerato in complemento a 2) anche il flag N assume valore 1.
  97. Ecco quindi cio` che ottenete eseguendo la somma:
  98.  
  99. D0: 0000E000 00009000 00000000 00000000 00000000 00000000 00000000 00000000
  100. A0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 07CA4754
  101. SSP=07CA5887 USP=07CA4754 SR=8019 T1 -- PL=0 XN--C PC=07CA7A80
  102. PC=07CA7A80 303C6000         MOVE.W  #$6000,D0
  103. >
  104.  
  105. Vediamo un terzo esempio. Questa volta sommiamo $5000(=20480) e $6000(=24576).
  106. Si tratta di 2 numeri positivi. A differenza del primo esempio, pero`,
  107. se eseguiamo la somma a mano vediamo che il risultato e` 45056(=$b000) che
  108. risulta maggiore di 32767, e infatti come potete notare e` un numero negativo.
  109. Pertanto se interpretiamo i numeri in complemento a 2 (cioe` vanno da -32768
  110. a 32767) il risultato e` sbagliato, e pertanto il flag V assume valore 1.
  111. Se invece interpretiamo i numeri come sempre positivi (cioe` da 0 a 65536)
  112. il risultato e` corretto, perche` e` minore di 65535. Pertanto il flag C
  113. assume valore zero. Il flag N assume comunque il valore 1 perche` abbiamo un
  114. numero negativo (se interpretato in complemento a 2). Infatti:
  115.  
  116. D0: 00006000 0000B000 00000000 00000000 00000000 00000000 00000000 00000000 
  117. A0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 07CA4754 
  118. SSP=07CA5887 USP=07CA4754 SR=800A T1 -- PL=0 -N-V- PC=07CA7A8A
  119. PC=07CA7A8A 303C9000             MOVE.W  #$9000,D0
  120. >
  121.  
  122. Vediamo ora un'ultimo esempio. Sommiamo $9000 e $a000. Si tratta di 2 numeri
  123. negativi. Se li interpretiamo in complemento a 2 e li sommiamo, notiamo
  124. che il risultato e` minore di -32768. Pertanto il flag V assume valore 1.
  125. Se li interpretiamo come numeri positivi, abbiamo che la loro somma sarebbe
  126. $13000 che ha bisogno di 17 bit. Pertanto anche il flag C vale 1. 
  127. Come risultato otteniamo $3000 ovvero i 16 bit meno significativi della somma.
  128. Poiche` $3000 e` positivo, il flag N vale zero.
  129.  
  130. D0: 00009000 00003000 00000000 00000000 00000000 00000000 00000000 00000000 
  131. A0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 07CA4754 
  132. SSP=07CA5887 USP=07CA4754 SR=8013 T1 -- PL=0 X--VC PC=07CA7A94
  133. PC=07CA7A94 4E75                 RTS     
  134. >
  135.  
  136.