Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .section .text
- .globl inter_to_roman
- dec: .long 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1
- rom1: .ascii "MCDCCXLXXIVII" #ovo je niz prvih karaktera rimskih cifara(kod odredjenih brojeva (5 == V) i jedini karakter)
- rom2: .ascii " M D C L X V " #ovo je niz drugih karaktera rimskih cifara (9==IX)
- #int inter_to_roman(unsigned int broj, char *str, int duzina);
- inter_to_roman:
- pushl %ebp
- movl %esp,%ebp
- subl $4,%esp #za lokalnu promenljivu - greska
- pushl %ebx
- pushl %esi
- movl 8(%ebp),%eax #broj u eax
- movl 12(%ebp),%ebx #adresa stringa u ebx
- xorl %ecx,%ecx #brojac za dec,rom1,rom2
- leal dec,%esi #adresa pocetka niza vrednosti rimskih brojeva u edx
- movl $0,-4(%ebp) #greska se inicijalizuje na 0
- cmpl $0,%eax #provera da li je eax pozitivan broj
- jle greska
- #!!! Primetiti da se na parnim mestima u nizu rom1 nalaze jednocifreni rimski brojevi M,D,C,L,X,V,I
- # na neparnim mestima u nizu rom1 i rom2(posmatraj paralelno nizove,tim redom) nalaze dvocifrene rimske cifre CM,CD,XC,XL,IX,IV
- #!!! Primetiti da se i u nizu dec na parnim mestima nalaze vrednosti jednocifrenih rimskih brojeva 1000,500,100,50,10,5,1
- # na neparnim mestima nalaze vrednosti dvocifrenih rimskih brojeva 900,400, 90,40, 9,4
- petlja:
- cmpl $0,rom1(,%ecx,1) #petlja se zavrsava kad stignemo do \0 stringa rom1 == nemamo vise cifara
- je kraj_petlje
- cmpl (%esi,%ecx,4),%eax #poredim vrednost rimske cifre sa brojem
- jae proveri_duzinu #ako je broj veci od vrednosti rimske cifre,treba da je oduzmem od broja, ali prvo proveravam preostalu duzinu stringa
- incl %ecx #ako nije predji na sledecu vrednost rimske cifre (sledecu rimsku cifru)
- jmp petlja
- proveri_duzinu:
- shrl %ecx #proveravam da li je ecx paran, shiftam ecx u desno, u carry ispada ostatak koji ako je 1 broj je neparan, ako je nula broj je paran
- jc oduzmi_2_char
- oduzmi_1_char:
- rcll %ecx #rotate through carry left, da bih u ecx imao ponovo isti broj
- decl 16(%ebp) #oduzimam 1 mesto koje cu ispucati na rimsku cifru
- cmpl $1,16(%ebp) #jedno mesto ostavljam za NULL
- jl greska
- subl (%esi,%ecx,4),%eax
- movb rom1(,%ecx,1),%dl
- movb %dl,(%ebx)
- incl %ebx
- jmp petlja
- oduzmi_2_char: #ako je neparan broj, to znaci da mi treba neka dvocifrena cifra iz rimskog sistema
- rcll %ecx #rotate through carry left, da bih u ecx imao ponovo isti broj
- subl $2,16(%ebp) #oduzimam 2 mesta koje cu ispucati na 2 rimske cifre
- cmpl $1,16(%ebp) #jedno mesto ostavljam za NULL
- jl greska
- subl (%esi,%ecx,4),%eax #oduzimam vrednost rimske cifre od broja
- movb rom1(,%ecx,1),%dl #prebacujem redom karaktere za dvocifreni rimski broj
- movb %dl,(%ebx)
- movb rom2(,%ecx,1),%dh
- movb %dh,1(%ebx)
- addl $2,%ebx #adresu uvecavam za 2
- jmp petlja
- kraj_petlje:
- movb $0,(%ebx)
- jmp kraj
- greska:
- incl -4(%ebp)
- kraj:
- movl -4(%ebp),%eax
- popl %esi
- popl %ebx
- movl %ebp,%esp
- popl %ebp
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement