Advertisement
lukicdarkoo

Priprema za Test34, zadatak 4

Apr 26th, 2014
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # int RazmeniBit(unsigned short *A, unsigned N);
  2.  
  3. .section .text
  4. .globl RazmeniBit
  5.  
  6. RazmeniBit:
  7.     pushl %ebp
  8.     movl %esp, %ebp
  9.  
  10.     subl $4, %esp   #oslobadjam prostor za lokalnu promjenjivu
  11.  
  12.     pushl %esi
  13.     pushl %edi
  14.     pushl %ebx  #ova tri registra nije dozvoljeno koristiti ako ne ubacimo na stek
  15.    
  16.     movl 8(%ebp), %esi  #pocetak niza
  17.     movl 12(%ebp), %ecx #broj clanova
  18.  
  19.  
  20.     movl $0, -4(%ebp)   #postavljam vrijednost lokalne na 0
  21.     movl $0, %edi   #brojac kroz niz
  22.     petlja:
  23.     cmpl %edi, %ecx
  24.     je petljaKraj
  25.         movw (%esi, %edi, 2), %dx   #smjestam clan niza u %dx
  26.  
  27.  
  28.         movw $0, %ax    #inicijalizuje %al i %ah na 0
  29.  
  30.         petljaJedinice: #petlja roluje sve bitove iz %dx
  31.         cmpb $16, %ah  
  32.         je petljaJediniceKraj
  33.  
  34.             rolw $1, %dx
  35.             adcb $0, %al    #ako je rolovan bit 1 onda ce iz carry dodati u %al
  36.            
  37.             incb %ah
  38.         jmp petljaJedinice
  39.         petljaJediniceKraj:
  40.  
  41.         #e sad malo tezi dio
  42.  
  43.         andb $1, %al
  44.         cmpb $1, %al   
  45.         je petljaNeparanBroj    #provjerava da li posljednji bit 1, odnosno da li je broj neparan
  46.        
  47.  
  48.  
  49.             movw $7, %ax   
  50.             movw $7, %bx
  51.             shlw $13, %bx   #pravi dvije maske, %ax = ...000111, %bx = 111000...
  52.        
  53.             andw %dx, %bx
  54.             andw %dx, %ax   #u %bx i %ax smjesta prva i posljednja tri bita
  55.        
  56.             shrw $13, %bx
  57.             shlw $13, %ax   #mijenjam mjesta, %bx = ...000111, %ax = 111000...
  58.  
  59.             shlw $3, %dx
  60.             shrw $6, %dx
  61.             shlw $3, %dx    #tresem ga :) postavljam 0 na posljednja i prva tri bita
  62.        
  63.             orw %bx, %dx
  64.             orw %ax, %dx    #spajam maske sa brojem, posljednji korak u smjeni bitova
  65.  
  66.             movw %dx, (%esi, %edi, 2)   #smjestam vrijednost u niz
  67.  
  68.             incl -4(%ebp)   #lokalna promjenjiva za brojac parnih brojeva, uvecavam za 1
  69.  
  70.         jmp petljaBrojac
  71.  
  72.  
  73.         petljaNeparanBroj:  #isto kao i ovo gore
  74.  
  75.             movw $1, %ax
  76.             movw $1, %bx
  77.             shlw $15, %bx
  78.        
  79.             andw %dx, %bx
  80.             andw %dx, %ax
  81.        
  82.             shrw $15, %bx
  83.             shlw $15, %ax
  84.  
  85.             shlw $1, %dx
  86.             shrw $2, %dx
  87.             shlw $1, %dx
  88.        
  89.             orw %bx, %dx
  90.             orw %ax, %dx
  91.  
  92.             movw %dx, (%esi, %edi, 2)
  93.            
  94.  
  95.  
  96.         petljaBrojac:
  97.         incl %edi
  98.     jmp petlja
  99.     petljaKraj:
  100.  
  101.  
  102.     movl -4(%ebp), %eax #smjestam broj elemenata sa parnim brojem 1 u %eax, u povratnu vrijednost funkcije
  103.  
  104.     popl %ebx  
  105.     popl %edi
  106.     popl %esi   #zbog onoga pushl sad pocetka
  107.  
  108.     movl %ebp, %esp
  109.     popl %ebp
  110.     ret
  111.  
  112.  
  113.  
  114.  
  115. ############################ C kod (malo izmijenjen) ########################
  116. #include <stdio.h>
  117. #include <stdlib.h>
  118.  
  119. int RazmeniBit(unsigned short *A, unsigned N);
  120.  
  121. void printbin16(unsigned short int x) {
  122.     unsigned short int m=0x8000, s=0;
  123.     while(m) {
  124.         printf("%s%s",m&x ? "1" : "0",++s%8 ? "" : " ");
  125.         m >>= 1;
  126.     }
  127.     printf(" (%d)",x);
  128. }
  129.  
  130. int main()
  131. {
  132.     int br_par=0;
  133.     int i;
  134.     int n=5;
  135.     unsigned short niz[5]={21, 11117, 5, 65532, 17};
  136.  
  137.     printf("Niz pre poziva RazmeniBit():\n");
  138.     for(i=0;i<n;i++){
  139.         printf(" %04x \n", niz[i]);
  140.         printbin16(niz[i]);
  141.     }
  142.  
  143.     br_par=RazmeniBit(niz, n);
  144.  
  145.  
  146.     printf("Niz posle poziva Razmeni Bit():\n");
  147.     for(i=0;i<n;i++){
  148.         printf(" %04x \n", niz[i]);
  149.         printbin16(niz[i]);
  150.  
  151.     }
  152.     printf("Broj el. sa parnim br. jedinica = %d\n\n", br_par);
  153.  
  154.     return 0;
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement