Advertisement
Gianvy

[ESAME] togli_pari - simulazione (modificata) 05/12/2017

Dec 16th, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .586
  2. .model flat
  3. .code
  4.  
  5. ; int togli_pari(unsigned char * src, int lunghezza);
  6. ; 1) (Esame superato 0 punti) La funzione deve sostituire in src gli elementi pari ovvero quando src[i] è
  7. ; pari. La sostituzione deve essere fatta SOLO SE gli elementi che precedono e seguono l’i-esimo elemento
  8. ; sono pari ovvero:
  9. ; src[i-1] pari AND src[i+1] pari
  10. ; La sostituzione deve essere fatta facendo la media degli elementi che precedono e seguono l’i-esimo
  11. ; elemento e ottenendo il numero pari corrispondente:
  12. ; src[i]= (src[i-1]+src[i+1])/2 se la media è pari
  13. ; oppure
  14. ; src[i]= (src[i-1]+src[i+1])/2 +1 se la media è pari
  15. ; Il vettore src è pre allocato nel main ed è di lunghezza “lunghezza” e MAI vuoto. Inoltre il primo e l’ultimo
  16. ; elemento in questo caso NON sono mai pari.
  17. ; La funzione ritorna 0.
  18. ; ad. Esempio:
  19. ; #include <stdio.h>
  20. ;
  21. ; int togli_pari(unsigned char*, int);
  22. ;
  23. ; int main()
  24. ; {
  25. ;   unsigned char src[6] = { 3, 0, 1, 6, 5, 3 };
  26. ;   int ret = togli_pari(src, 6);
  27. ; }
  28. ; In dst ci saranno {2,4,4,4,6,8} return 0
  29. ; 2) (Esame superato 1 punto) se in src i numeri sono tutti dispari NON modificarlo e Ritornare -2
  30. ; 3) (Esame superato 2 punti) se in src i numeri sono tutti pari NON modificarlo e Ritornare -1
  31. ; 4) (Esame superato 3 punti) se il numero di elementi modificati è PARI e diverso da 0. Il valore di ritorno
  32. ; della funzione è il numero di elementi di src modificati.
  33.  
  34. _togli_pari proc
  35.     push ebp
  36.     mov ebp, esp
  37.  
  38.     mov ecx, 0
  39.     push ecx
  40.  
  41.     push ebx
  42.     push esi
  43.     push edi
  44.  
  45.     mov eax, dword ptr[ebp + 8] ;vettore src
  46.     mov ecx, dword ptr[ebp +12] ;lunghezza vettore
  47.  
  48.     mov esi, 0
  49.     mov edi, 0      ;numero di numeri dispari
  50.     mov edx, 0      ;numero di numeri pari
  51.     iniziociclop1:
  52.     cmp esi, ecx
  53.     je fineciclop1
  54.         mov bl, byte ptr[eax + esi]
  55.         call ispari
  56.         cmp ebx, 0
  57.         je okpari
  58.             inc edx     ;pari
  59.             jmp goon
  60.         okpari:
  61.             inc edi     ;dispari
  62.         goon:
  63.         inc esi
  64.         jmp iniziociclop1
  65.     fineciclop1:
  66.  
  67.     cmp edx, ecx
  68.     jne chissenefrega1
  69.     mov eax, -1
  70.     jmp fineciclospeciale
  71.     chissenefrega1:
  72.     cmp edi, ecx
  73.     jne chissenefrega
  74.     mov eax, -2
  75.     jmp fineciclospeciale
  76.    
  77.  
  78.     chissenefrega:
  79.  
  80.     dec ecx                     ;lunghezza vettore - 1
  81.     mov esi, 1
  82.     iniziociclo:
  83.     cmp esi, ecx
  84.     jge fineciclonormale
  85.         mov edx, 0 ; somma
  86.  
  87.         mov ebx, esi
  88.         push ebx                            ;controllo elemento pari, se non è pari continuo
  89.             mov bl, byte ptr[eax + ebx]
  90.             call ispari
  91.             cmp ebx, 1
  92.             jne continua
  93.         pop ebx
  94.        
  95.         dec ebx
  96.         push ebx
  97.             mov bl, byte ptr[eax + ebx]
  98.             call ispari
  99.             cmp ebx, 0
  100.             jne continua
  101.         pop ebx
  102.         mov bl, byte ptr[eax + ebx]
  103.         mov dl, bl              ;dl = bl
  104.  
  105.         mov ebx, esi
  106.         inc ebx
  107.         push ebx
  108.             mov bl, byte ptr[eax + ebx]
  109.             call ispari
  110.             cmp ebx, 0
  111.             jne continua
  112.         pop ebx
  113.         mov bl, byte ptr[eax + ebx]
  114.         add dl, bl              ;dl = bl1 + bl2
  115.  
  116.         push eax
  117.             mov eax, 0
  118.             mov al, dl
  119.             push edx
  120.                 push ecx
  121.                     mov cl, 2
  122.                     div cl
  123.                 pop ecx
  124.                 mov bl, al
  125.                 call ispari
  126.                 cmp ebx, 0
  127.                 jne sommaancheuno
  128.                     mov edx, dword ptr[ebp + 8] ;vettore src
  129.                     mov byte ptr[edx + esi], al
  130.                     inc dword ptr[ebp - 4]
  131.                     jmp finedellop
  132.                 sommaancheuno:
  133.                     mov edx, dword ptr[ebp + 8] ;vettore src
  134.                     mov byte ptr[edx + esi], al
  135.                     add byte ptr[edx + esi], 1
  136.                     inc dword ptr[ebp - 4]
  137.                 finedellop:
  138.             pop edx
  139.         pop eax
  140.  
  141.         continua:
  142.         inc esi
  143.         jmp iniziociclo
  144.     fineciclonormale:
  145.     mov eax, 0
  146.     fineciclospeciale:
  147.  
  148.     cmp dword ptr[ebp - 4], 0
  149.     je avanti
  150.     mov ebx, dword ptr[ebp - 4]
  151.     call ispari
  152.     cmp ebx, 1
  153.     jne avanti
  154.     mov eax, dword ptr[ebp - 4]
  155.     avanti:
  156.  
  157.  
  158.     pop edi
  159.     pop esi
  160.     pop ebx
  161.  
  162.     mov esp, ebp
  163.     pop ebp
  164.  
  165.     ret
  166. _togli_pari endp
  167.  
  168. ;============ ISPARI ================
  169. ; ebx numero da verificare
  170. ; ebx ritorna 0 se dispari 1 se pari
  171. ;====================================
  172. ispari proc
  173.     push ebp
  174.     mov ebp, esp
  175.  
  176.     push esi
  177.     push eax
  178.     push ecx
  179.     push edx
  180.  
  181.     mov ax, 0
  182.     mov al, bl
  183.     mov cl, 2
  184.     div cl
  185.     mov ebx, 0
  186.     cmp ah, 0
  187.     jne notispari
  188.     mov ebx, 1
  189.     notispari:
  190.  
  191.     pop edx
  192.     pop ecx
  193.     pop eax
  194.     pop esi
  195.  
  196.     mov esp, ebp
  197.     pop ebp
  198.  
  199.     ret
  200. ispari endp
  201. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement