Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # int RazmeniBit(unsigned short *A, unsigned N);
- .section .text
- .globl RazmeniBit
- RazmeniBit:
- pushl %ebp
- movl %esp, %ebp
- subl $4, %esp #oslobadjam prostor za lokalnu promjenjivu
- pushl %esi
- pushl %edi
- pushl %ebx #ova tri registra nije dozvoljeno koristiti ako ne ubacimo na stek
- movl 8(%ebp), %esi #pocetak niza
- movl 12(%ebp), %ecx #broj clanova
- movl $0, -4(%ebp) #postavljam vrijednost lokalne na 0
- movl $0, %edi #brojac kroz niz
- petlja:
- cmpl %edi, %ecx
- je petljaKraj
- movw (%esi, %edi, 2), %dx #smjestam clan niza u %dx
- movw $0, %ax #inicijalizuje %al i %ah na 0
- petljaJedinice: #petlja roluje sve bitove iz %dx
- cmpb $16, %ah
- je petljaJediniceKraj
- rolw $1, %dx
- adcb $0, %al #ako je rolovan bit 1 onda ce iz carry dodati u %al
- incb %ah
- jmp petljaJedinice
- petljaJediniceKraj:
- #e sad malo tezi dio
- andb $1, %al
- cmpb $1, %al
- je petljaNeparanBroj #provjerava da li posljednji bit 1, odnosno da li je broj neparan
- movw $7, %ax
- movw $7, %bx
- shlw $13, %bx #pravi dvije maske, %ax = ...000111, %bx = 111000...
- andw %dx, %bx
- andw %dx, %ax #u %bx i %ax smjesta prva i posljednja tri bita
- shrw $13, %bx
- shlw $13, %ax #mijenjam mjesta, %bx = ...000111, %ax = 111000...
- shlw $3, %dx
- shrw $6, %dx
- shlw $3, %dx #tresem ga :) postavljam 0 na posljednja i prva tri bita
- orw %bx, %dx
- orw %ax, %dx #spajam maske sa brojem, posljednji korak u smjeni bitova
- movw %dx, (%esi, %edi, 2) #smjestam vrijednost u niz
- incl -4(%ebp) #lokalna promjenjiva za brojac parnih brojeva, uvecavam za 1
- jmp petljaBrojac
- petljaNeparanBroj: #isto kao i ovo gore
- movw $1, %ax
- movw $1, %bx
- shlw $15, %bx
- andw %dx, %bx
- andw %dx, %ax
- shrw $15, %bx
- shlw $15, %ax
- shlw $1, %dx
- shrw $2, %dx
- shlw $1, %dx
- orw %bx, %dx
- orw %ax, %dx
- movw %dx, (%esi, %edi, 2)
- petljaBrojac:
- incl %edi
- jmp petlja
- petljaKraj:
- movl -4(%ebp), %eax #smjestam broj elemenata sa parnim brojem 1 u %eax, u povratnu vrijednost funkcije
- popl %ebx
- popl %edi
- popl %esi #zbog onoga pushl sad pocetka
- movl %ebp, %esp
- popl %ebp
- ret
- ############################ C kod (malo izmijenjen) ########################
- #include <stdio.h>
- #include <stdlib.h>
- int RazmeniBit(unsigned short *A, unsigned N);
- void printbin16(unsigned short int x) {
- unsigned short int m=0x8000, s=0;
- while(m) {
- printf("%s%s",m&x ? "1" : "0",++s%8 ? "" : " ");
- m >>= 1;
- }
- printf(" (%d)",x);
- }
- int main()
- {
- int br_par=0;
- int i;
- int n=5;
- unsigned short niz[5]={21, 11117, 5, 65532, 17};
- printf("Niz pre poziva RazmeniBit():\n");
- for(i=0;i<n;i++){
- printf(" %04x \n", niz[i]);
- printbin16(niz[i]);
- }
- br_par=RazmeniBit(niz, n);
- printf("Niz posle poziva Razmeni Bit():\n");
- for(i=0;i<n;i++){
- printf(" %04x \n", niz[i]);
- printbin16(niz[i]);
- }
- printf("Broj el. sa parnim br. jedinica = %d\n\n", br_par);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement