Advertisement
nex036ara

konvert(ceo_razlomljen)

May 22nd, 2011
247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #program koji konvertuje razlomljeni decimalni iz znakovnog u interni i u zavisnosti od karaktera izvrsava odgovarajucu operaciju nad celim, odnosno razlomljenim delom broja.(unos je jedan string npr, 123.456 razmak operacija) Dozvoljene operacije  ^(xorl), &(and). Ako karakter odgovara ovim operacijama primeni ih na celom delu, ako ne odgovara, primeni ~(not) na razlomljenom delu. Rezultat vrati u binarni oblik, takodje ispisi poruke ukoliko dodje do pogresnog unosa.
  2. #autor: Branislav Nikolić
  3.  
  4. .section .data
  5. N = 50
  6. pocetna:  .ascii "Unesi string:\0"
  7. unos:     .fill N,1,0
  8. rezultat: .fill N,1,0
  9. greska_a: .ascii "Pogresan operand a.\0"
  10. greska_b: .ascii "Pogresan operand b.\0"
  11. krajnja:  .ascii "Rezultat je:\0"
  12. pogresan_unos: .ascii "Pogresan unos!\0"
  13. .section .text
  14. .globl main
  15. main:
  16.     movl $4, %eax
  17.     movl $1, %ebx
  18.     leal pocetna, %ecx
  19.     movl $13, %edx
  20.     int $0x80
  21.    
  22.     movl $3, %eax
  23.     movl $0, %ebx
  24.     leal unos, %ecx
  25.     movl $N, %edx
  26.     int $0x80
  27.  
  28.     xorl %eax, %eax
  29.     leal unos, %eax
  30.     pushl %eax
  31.     call to_int
  32.     cmpl $555, %eax
  33.     je greska_unos
  34.     cmpl $71, %eax
  35.     je greska_operand_a
  36.     cmpl $71, %edx
  37.     je greska_operand_b
  38.     addl $4, %esp
  39.  
  40.     pushl %eax #celi
  41.     pushl %ecx #razl
  42.     pushl %edx #op
  43.     call exe
  44.     addl $12, %esp
  45.    
  46.     xorl %ebx, %ebx
  47.     leal rezultat, %ebx
  48.     pushl %ecx
  49.     pushl %ebx
  50.     call to_char
  51.     addl $8, %esp
  52.  
  53.     movl $4, %eax
  54.     movl $1, %ebx
  55.     leal krajnja, %ecx
  56.     movl $13, %edx
  57.     int $0x80
  58.  
  59.     movl $4, %eax
  60.     movl $1, %ebx
  61.     leal rezultat, %ecx
  62.     movl $8, %edx
  63.     int $0x80
  64. kraj:
  65.     movl $1, %eax
  66.     int $0x80
  67.  
  68. greska_operand_a:
  69.     movl $4, %eax
  70.     movl $1, %ebx
  71.     leal greska_a, %ecx
  72.     movl $19, %edx
  73.     int $0x80
  74.     jmp kraj
  75. greska_operand_b:
  76.     movl $4, %eax
  77.     movl $1, %ebx
  78.     leal greska_b, %ecx
  79.     movl $19, %edx
  80.     int $0x80
  81.     jmp kraj
  82. greska_unos:
  83.     movl $4, %eax
  84.     movl $1, %ebx
  85.     leal pogresan_unos, %ecx
  86.     movl $14, %edx
  87.     int $0x80
  88.     jmp kraj
  89.    
  90. #=============================================
  91.  
  92.  
  93.  
  94.  
  95. #potprogram koji konvertuje decimalni razlomljeni string i pamti operaciju, celi deo u eax, razlomljeni u ecx, operacija u edx
  96.  
  97. .section .text
  98. .globl to_int
  99. to_int:
  100.     pushl %ebp
  101.     movl %esp, %ebp
  102.     pushl %esi
  103.     pushl %edi
  104.     pushl %ebx
  105.     movl 8(%ebp), %esi #pokazivac na string unos
  106.     movl %esi, %edi    #kod poredjenja adresa za prazan string
  107.     movl $10, %ecx  #baza
  108.     xorl %ebx, %ebx #karakter
  109.     xorl %edx, %edx #indikator upisa
  110.     xorl %eax, %eax #rezultat
  111. konvert_pocetak:
  112.     movb (%esi), %bl
  113.     cmpb $' ', %bl
  114.     je set_unos
  115.     cmpb $10, %bl
  116.     je set_unos
  117.    
  118.     cmpl $0, %edx
  119.     je konvert_nastavi
  120.     cmpl $1, %edx
  121.     je konvert_razlomi
  122.  
  123. provera_operacije:
  124.     cmpb $'^', %bl
  125.     je upisi_op
  126.     cmpb $'&', %bl
  127.     je upisi_op
  128.     jmp upisi_op_not
  129.  
  130. konvert_nastavi:
  131.     cmpb $'.', %bl
  132.     je upisi_a
  133.     cmpb $'0', %bl
  134.     jl set_a
  135.     cmpb $'9', %bl
  136.     jle broj
  137.     jmp set_a
  138. broj:
  139.     subb $'0', %bl
  140.     mull %ecx
  141.     andl %edx, %edx
  142.     jnz set_a
  143.     addl %ebx, %eax
  144.     jc set_a
  145.     incl %esi
  146.     jmp konvert_pocetak
  147. upisi_a:
  148.     movl %eax, -4(%ebp)
  149.     movl $1, %edx
  150.     xorl %eax, %eax
  151.     incl %esi
  152.     jmp konvert_pocetak
  153. upisi_b:
  154.     movl %eax, -8(%ebp)
  155.     movl $2, %edx
  156.     xorl %eax, %eax
  157. do_operacije:      
  158.     incl %esi
  159.     movb (%esi), %bl
  160.     cmpb $' ', %bl
  161.     je do_operacije
  162.     jmp konvert_pocetak
  163. upisi_op:
  164.     movb %bl, -12(%ebp)
  165.     xorl %eax, %eax
  166.     incl %esi
  167.     movb (%esi), %bl
  168.     cmpb $10, %bl
  169.     je kraj_pp
  170.     jmp set_op
  171.  
  172. upisi_op_not:
  173.     movb $'~', -12(%ebp)
  174.     jmp kraj_pp
  175.  
  176.  
  177. set_unos:
  178.     movl $555, -4(%ebp)
  179.     jmp kraj_pp
  180. set_a:
  181.     movl $71, -4(%ebp)
  182.     jmp kraj_pp
  183. set_b:
  184.     movl $71, -8(%ebp)
  185.     jmp kraj_pp
  186. set_op:
  187.     movl $71, -12(%ebp)
  188.     jmp kraj_pp
  189.    
  190. konvert_razlomi:
  191.     movl $10, %ecx  
  192.     xorl %edx, %edx #indikator upisa
  193.     xorl %eax, %eax #rezultat
  194.  
  195. nastavi_razlomi:
  196.     movb (%esi), %bl
  197.     cmpb $10, %bl
  198.     je set_b
  199.     cmpb $' ', %bl
  200.     je upisi_b
  201.    
  202.     cmpb $'0', %bl
  203.     jl set_b
  204.     cmpb $'9', %bl
  205.     jle broj_b
  206.     jmp set_b
  207. broj_b:
  208.     subb $'0', %bl
  209.     mull %ecx
  210.     andl %edx, %edx
  211.     jnz set_b
  212.     addl %ebx, %eax
  213.     jc set_b
  214.     cmpl $1000000000, %eax
  215.     jae set_b
  216.    
  217.     incl %esi
  218.     jmp nastavi_razlomi
  219.  
  220.  
  221.  
  222. kraj_pp:
  223.     movl -4(%ebp), %eax #celi deo
  224.     movl -8(%ebp), %ecx #razlomljeni deo
  225.     movl -12(%ebp), %edx #operacija
  226.     popl %ebx
  227.     popl %edi
  228.     popl %esi
  229.     leave
  230.     ret
  231.  
  232. #=========================================================
  233. #ispitivanje operacije i primena na operandima
  234. .section .text
  235. .globl exe
  236. exe:
  237.     pushl %ebp
  238.     movl %esp, %ebp
  239.     pushl %esi
  240.     pushl %edi
  241.     pushl %ebx
  242.     movl 8(%ebp), %eax #operacija
  243.     movl 12(%ebp),%ebx #razl
  244.     movl 16(%ebp), %ecx #celi
  245.  
  246. provera_operacije:
  247.     cmpb $'^', %al
  248.     je xor_a
  249.     cmpb $'&', %al
  250.     je and_a
  251.     cmpb $'~', %al
  252.     je not_b
  253. xor_a:
  254.     xorl %ecx, %ecx
  255.     jmp kraj_pp
  256. and_a:
  257.     andl %ecx, %ecx
  258.     jmp kraj_pp
  259. not_b:
  260.     notl %ebx
  261.     movl %ebx, %ecx
  262.     jmp kraj_pp
  263.  
  264. kraj_pp:
  265.     popl %ebx
  266.     popl %edi
  267.     popl %esi
  268.     leave
  269.     ret
  270.  
  271. #===================================================
  272. # rezultat ecx vrati u string rezultat u binarnom formatu
  273. .section .text
  274. .globl to_char
  275. to_char:
  276.     pushl %ebp
  277.     movl %esp, %ebp
  278.     pushl %esi
  279.     pushl %edi
  280.     pushl %ebx
  281.     movl 8(%ebp), %esi #pokazivac stringa rezultat
  282.     movl %esi, %edi
  283.     movl 12(%ebp), %eax #vrednost za konverziju
  284.    
  285. konvert:
  286.     shrl $1, %eax
  287.     rclb $1, %bl
  288.     andb $1, %bl
  289.     addb $'0', %bl
  290.     movb %bl, (%esi)
  291.     incl %esi
  292.     andl %eax, %eax
  293.     jnz konvert
  294.     movb $0, (%esi)
  295.     decl %esi
  296. obrni:
  297.     cmpl %esi, %edi
  298.     jae kraj_pp
  299.     movb (%edi), %ah
  300.     movb (%esi), %al
  301.     movb %ah, (%esi)
  302.     movb %al, (%edi)
  303.     incl %edi
  304.     decl %esi
  305.     jmp obrni
  306. kraj_pp:
  307.     popl %ebx
  308.     popl %edi
  309.     popl %esi
  310.     leave
  311.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement