riccardinofuffolo

Calcolatori elettronici - Esame 23/02/2011

Jun 21st, 2011
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. DIM EQU 8
  2.  
  3. .MODEL small
  4. .STACK
  5. .DATA
  6.  
  7. VET1 DB 00101101B, 01000010B, 01001011B, 10000001B, 01100001B, 11000000B, 11111111B, 00001011B
  8. VET2 DW DIM DUP(?)
  9.  
  10. .CODE
  11. .STARTUP
  12.  
  13. CALL EXTRACT
  14.  
  15. .EXIT
  16. EXTRACT PROC
  17.     MOV BL, 3   ; Numero di nibble in ogni gruppo da 12 bit (esclusi i più alti)
  18.     MOV AX, DIM ; Numero di byte in VET1
  19.     SHL AX, 1   ; Numero di nibble in VET1
  20.     DIV BL      ; In AL ho il numero di sequenze da comporre
  21.    
  22.     PUSH AX     ; Salvo quest'informazione nello stack (mi servirà come ritorno)
  23.  
  24.     MOV SI, 0
  25.     MOV DI, 0
  26.    
  27.     SEQUENZA: TEST AL, 00000001B     ; Sono in un passaggio pari o dispari?
  28.                   JPE PARI               ; Bit a 1 pari -> numero pari
  29.  
  30.     DISPARI:  MOV BX, 0              ; Azzero il registro che mi contiene la singola sequenza
  31.                   ADD BL, VET1[SI]       ; Prendo il primo byte (0000 0000) 0010 1101
  32.                   SHL BX, 4              ; 0000 0000 0010 1101 --> 0000 0010 1101 0000
  33.                   INC SI                 ; Passo al byte successivo
  34.                   MOV DH, VET1[SI]      
  35.                   SHR DH, 4              ; DH = 0000 0100
  36.                   ADD BL, DH             ; 0000 0010 1101 0000 --> 0000 0010 1101 0100
  37.                   MOV VET2[DI], BX       ; Copio la sequenza nel vettore
  38.                   JMP PROSSIMO
  39.  
  40.     PARI:     MOV BX, 0
  41.                   MOV DH, VET1[SI]       ; Non mi sono spostato, sono sul byte puntato da SI
  42.                   AND DH, 00001111B      ; Prendo solo la parte bassa
  43.                   ADD BL, DH             ; Salvo i primi quattro bit 0010
  44.                   SHL BX, 8              ; 0000 0000 0000 0010 --> 0000 0010 0000 0000
  45.                   INC SI                 ; Passo alla successiva entry di dati
  46.                   ADD BL, VET1[SI]       ; 0000 0010 0000 0000 --> 0000 0010 0100 1011
  47.                   MOV VET2[DI], BX       ; Copio la sequenza nel vettore
  48.  
  49.     PROSSIMO: ADD DI, 2              ; Punto alla prossima sequenza da inserire in risultati
  50.                   DEC AL                 ; Decremento il numero di passi
  51.                   CMP AL, 0
  52.                   JNZ SEQUENZA      
  53.  
  54.     POP AX                   ; Ripristino in AX il numero di elementi che ho generato
  55.     MOV AH, 0                        ; Forse c'era un resto in AH (non mi è mai servito!)  
  56.     MOV DI, AX                       ; Rispondo alle specifiche richieste  
  57.            
  58.     RET
  59. EXTRACT ENDP
  60. END
Advertisement
Add Comment
Please, Sign In to add comment