Advertisement
Guest User

Untitled

a guest
May 19th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.93 KB | None | 0 0
  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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement