SHARE
TWEET

Untitled

a guest May 19th, 2019 74 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .section .text
  2. .globl inter_to_roman
  3. dec:    .long 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1
  4. rom1:   .ascii "MCDCCXLXXIVII"      #ovo je niz prvih karaktera rimskih cifara(kod odredjenih brojeva (5 == V) i jedini karakter)
  5. rom2:   .ascii " M D C L X V "      #ovo je niz drugih karaktera rimskih cifara (9==IX)
  6.  
  7. #int inter_to_roman(unsigned int broj, char *str, int duzina);
  8. inter_to_roman:
  9.     pushl %ebp
  10.     movl %esp,%ebp
  11.     subl $4,%esp            #za lokalnu promenljivu - greska
  12.     pushl %ebx
  13.     pushl %esi
  14.    
  15.  
  16.     movl 8(%ebp),%eax       #broj u eax    
  17.     movl 12(%ebp),%ebx      #adresa stringa u ebx
  18.     xorl %ecx,%ecx          #brojac za dec,rom1,rom2
  19.     leal dec,%esi           #adresa pocetka niza vrednosti rimskih brojeva u edx
  20.     movl $0,-4(%ebp)        #greska se inicijalizuje na 0
  21.    
  22.     cmpl $0,%eax            #provera da li je eax pozitivan broj
  23.     jle greska
  24.  
  25.  
  26. #!!! Primetiti da se na parnim mestima u nizu rom1 nalaze jednocifreni rimski brojevi M,D,C,L,X,V,I
  27. #                    na neparnim mestima u nizu rom1 i rom2(posmatraj paralelno nizove,tim redom) nalaze dvocifrene rimske cifre CM,CD,XC,XL,IX,IV
  28.  
  29. #!!! Primetiti da se i u nizu dec na parnim mestima nalaze vrednosti jednocifrenih rimskih brojeva 1000,500,100,50,10,5,1
  30. #                                 na neparnim mestima nalaze vrednosti dvocifrenih rimskih brojeva  900,400, 90,40, 9,4
  31.  
  32.  
  33. petlja:
  34.     cmpl $0,rom1(,%ecx,1)       #petlja se zavrsava kad stignemo do \0 stringa rom1 == nemamo vise cifara
  35.     je kraj_petlje
  36.     cmpl (%esi,%ecx,4),%eax     #poredim vrednost rimske cifre sa brojem
  37.     jae proveri_duzinu          #ako je broj veci od vrednosti rimske cifre,treba da je oduzmem od broja, ali prvo proveravam preostalu duzinu stringa
  38.     incl %ecx                   #ako nije predji na sledecu vrednost rimske cifre (sledecu rimsku cifru)
  39.     jmp petlja
  40.                                  
  41. proveri_duzinu:
  42.     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
  43.     jc oduzmi_2_char
  44.  
  45. oduzmi_1_char:
  46.     rcll %ecx               #rotate through carry left, da bih u ecx imao ponovo isti broj
  47.     decl 16(%ebp)           #oduzimam 1 mesto koje cu ispucati na rimsku cifru
  48.     cmpl $1,16(%ebp)        #jedno mesto ostavljam za NULL
  49.     jl greska
  50.  
  51.     subl (%esi,%ecx,4),%eax
  52.     movb rom1(,%ecx,1),%dl
  53.     movb %dl,(%ebx)
  54.     incl %ebx
  55.     jmp petlja
  56.  
  57. oduzmi_2_char:              #ako je neparan broj, to znaci da mi treba neka dvocifrena cifra iz rimskog sistema
  58.     rcll %ecx               #rotate through carry left, da bih u ecx imao ponovo isti broj
  59.     subl $2,16(%ebp)        #oduzimam 2 mesta koje cu ispucati na 2 rimske cifre
  60.     cmpl $1,16(%ebp)        #jedno mesto ostavljam za NULL
  61.     jl greska
  62.  
  63.     subl (%esi,%ecx,4),%eax #oduzimam vrednost rimske cifre od broja
  64.     movb rom1(,%ecx,1),%dl  #prebacujem redom karaktere za dvocifreni rimski broj
  65.     movb %dl,(%ebx)
  66.     movb rom2(,%ecx,1),%dh
  67.     movb %dh,1(%ebx)
  68.     addl $2,%ebx            #adresu uvecavam za 2
  69.     jmp petlja
  70.    
  71. kraj_petlje:
  72.     movb $0,(%ebx)
  73.     jmp kraj
  74.  
  75. greska:
  76.     incl -4(%ebp)
  77. kraj:
  78.     movl -4(%ebp),%eax
  79.     popl %esi
  80.     popl %ebx
  81.     movl %ebp,%esp
  82.     popl %ebp
  83.     ret
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top