maicol07

Assembly permutations

Jul 30th, 2021 (edited)
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.82 KB | None | 0 0
  1. /********************************************************************************
  2. Generare tutte le permutazioni dei primi N numeri naturali.
  3.               Le permutazioni generate vanno inserite all'interno di un unico
  4.             array di interi. Ad esempio, se N=3, l'array deve contenere:
  5.             {1,2,3, 1,3,2, 2,1,3, 2,3,1, 3,1,2, 3,2,1}.
  6.  
  7.  ********************************************************************************/
  8.  
  9.  
  10. #include <stdio.h>
  11.  
  12.  
  13. int main()
  14. {
  15. // Variabili
  16. int N=4;    // numero di interi (provare con valori <=6)
  17. int Perm[4326]; // array permutazioni: la dimensione è sufficiente per N<=6
  18. int Num;    // Alla fine deve contenere il numero di permutazioni generate
  19.  
  20. // Blocco assembler
  21.     __asm
  22.     {
  23.         XOR EAX, EAX    ; Azzera EAX (contatore permutazioni)
  24.         MOV ECX, N      ; Metti N in ECX
  25.         CMP ECX, 1      ; Confronta ECX e 1
  26.         JBE Piccolo     ; Se ECX <= 1 vai a Piccolo (casi particolari 1 e 0)
  27.  
  28.         DEC ECX     ; Decrementa ECX (in modo che ECX = N - 1)
  29.         MOV EAX,; Metti N in EAX
  30.  
  31.         MaxPerm:
  32.             MUL ECX         ; Esegui l'operazione EDX:EAX = EAX * ECX
  33.             LOOP MaxPerm    ; Cicla per trovare il numero di permutazioni
  34.  
  35.         MOV Num, EAX    ; Muovi EAX (n° permutazioni) in Num
  36.         MOV EAX, 1      ; Imposta EAX (numero permutazione) a 1
  37.         MOV EBX, 0      ; Azzera EBX (EBX = 0)
  38.         MOV ECX, 1      ; Azzera ECX
  39.  
  40.         CicloIniziale:
  41.             DEC ECX                 ; Decrementa ECX (per compararlo con N)
  42.             CMP ECX, N              ; Confronta ECX ed N
  43.             JE Permutazione         ; Se ECX == N (la prima permutazione è stata scritta, salta alla generazione delle successive)
  44.             INC ECX                 ; Incrementa ECX
  45.             MOV Perm[4*EBX], ECX    ; Inserisci ECX nell'array Perm
  46.             INC ECX                 ; Incrementa ECX
  47.             INC EBX                 ; Incrementa EBX
  48.             JMP CicloIniziale       ; Continua il ciclo
  49.  
  50.         Permutazione:
  51.             XOR EAX, EAX    ; Indice locale della permutazione attuale
  52.             XOR EBX, EBX    ; Indice permutazione precedente
  53.             MOV ECX, N      ; Indice assoluto della permutazione attuale
  54.             MOV EDI, 1      ; Valore k (elemento che viene spostato)
  55.             MOV ESI, 1      ; Nuova posizione di k
  56.            
  57.                 CicloPermutazione:
  58.                 CMP EAX, N              ; Confronta EAX e N
  59.                 JE ResetPerm            ; Se è stata raggiunta la fine della permutazione, vai a ResetPerm
  60.                 CMP EDI, N
  61.                 JNE ContPerm
  62.                 INC ESI
  63.                 CMP ESI, N
  64.                 DEC ESI
  65.                 JNE ContPerm
  66. ContPerm:       MOV EDX, Perm[4*EBX]    ; Altrimenti salva l'elemento della permutazione precedente in posizione EBX in EDX
  67.                 CMP EDX, EDI            ; Confronta EDX e EDI
  68.                 JE ValoreUguale         ; Se sono uguali, vai a ValoreUguale
  69.                 CMP EAX, ESI            ; Altrimenti confronta EAX e ESI
  70.                 JE InserisciElSpostato  ; Se è ora di spostare l'elemento, vai a InserisciElSpostato
  71.                 MOV Perm[4*ECX], EDX    ; Riporta il valore della permutazione precedente nella nuova permutazione
  72.  
  73.                 ContinuaCiclo:
  74.                     INC EBX                 ; Aumenta l'indice della permutazione precedente
  75.                     INC EAX                 ; Aumenta l'indice locale
  76.                     INC ECX                 ; Aumenta l'indice della nuova permutazione
  77.                     JMP CicloPermutazione   ; Continua il ciclo
  78.            
  79.                 InserisciElSpostato:
  80.                     MOV Perm[4*ECX], EDI    ; Metti nella nuova permutazione il valore EDI
  81.                     MOV EDX, N              ; EDX = N
  82.                     DEC EDX                 ; EDX -= 1
  83.                     CMP ESI, EDX            ; Confronta ESI e EDX
  84.                     JE ResettaK             ; Se ESI == EDX vai a ResettaK
  85.                     JMP ContinuaCiclo       ; Continua il ciclo
  86.                
  87.                 ValoreUguale:
  88.                     CMP EAX, 0              ; Confronta EAX e 0
  89.                     JZ PrimaPos             ; Se la posizione è la prima vai a PrimaPos
  90.                     MOV EDX, Perm[4*EBX+4]  ; Altrimenti salva l'elemento in posizione EBX - 1
  91.                     MOV Perm[4*ECX], EDX    ; Inserisci EDX nella nuova permutazione
  92.                     JMP ContinuaCiclo       ; Continua il ciclo
  93.                    
  94.                     PrimaPos:
  95.                         MOV EDX, Perm[4*EBX+4]  ; Salva in EDX l'elemento in posizione ECX + 1
  96.                         MOV Perm[4*ECX], EDX    ; Inserisci EDX nella nuova permutazione
  97.                         JMP ContinuaCiclo       ; Continua il ciclo
  98.  
  99.                 ResettaK:
  100.                     XOR ESI, ESI            ; Azzera ESI
  101.                     MOV EDI, Perm[4*EDI]    ; EDI = Perm[EDI]
  102.                     JMP ContinuaCiclo       ; Continua il ciclo
  103.  
  104.                 ResettaKN:
  105.                     CMP EDI, N          ; Confronta EDI e N
  106.                     JNE ContinuaCiclo   ; Se EDI != N allora continua il ciclo
  107.                     JMP ResettaK        ; Altrimenti vai a ResettaK
  108.  
  109.             ResetPerm:
  110.                 MOV EAX, Num            ; EAX = Num
  111.                 MUL DWORD PTR N         ; EAX *= N (Così da trovare il numero di elementi di tutte le permutazioni)
  112.                 CMP EAX, ECX            ; Confronta EAX e ECX
  113.                 JE Fine                 ; Se EAX == ECX (concluse le permutazioni) allora concludi
  114.                 XOR EAX, EAX            ; Altrimenti azzera EAX
  115.                 INC ESI                 ; Aumenta indice di k
  116.                 JMP CicloPermutazione   ; Continua il ciclo
  117.  
  118.         Piccolo:            ; Se N = 0 o N = 1, l'unica permutazione possibile è composta da 1 solo elemento
  119.             MOV Num, 1
  120.             MOV Perm[0], ECX
  121.            
  122.         Fine:
  123.     }
  124.  
  125. // Stampa su video
  126.     {
  127.         int i,j,k;
  128.         printf("%d permutazioni dei primi %d numeri naturali\n", Num, N);
  129.         for (i=k=0;i<Num;i++)
  130.         {
  131.             for (j=0;j<N;j++)
  132.             {
  133.                 printf("%3d",Perm[k++]);
  134.             }
  135.             printf("\n");
  136.         }
  137.     }
  138.  
  139.     return 0;
  140. }
  141.  
Add Comment
Please, Sign In to add comment