Advertisement
nex036ara

konvert1

May 22nd, 2011
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #program koji pretvara decimalni i heksadecimalni broj u interni oblik, i primenjuje operaciju u zavisnosti od unetog karaktera operacije i vraca string u heksadecimanom formatu.(kod heksadecimalnog unosa dozvoljena mala i velika slova, dozvoljene operacije ^, &,|) Ako je uneta pogresna operacija, negirati oba broja, sabrati ih, i kao izlaz vratiti string u oktalnom formatu. Za svaku aktivnost odstampati odgovarajucu poruku.
  2.  
  3. .section .data
  4. N = 50
  5. pocetna_poruka:  .ascii "Unesite string:\0"
  6. unos:            .fill N,1,0
  7. krajnja_poruka:  .ascii "Rezultat je:\0"
  8. rezultat:    .fill N,1,0
  9. greska_a:        .ascii "Pogresan prvi operand!\0"
  10. greska_b:        .ascii "Pogresan drugi operand!\0"
  11. greska_op:       .ascii "Operacija pogresna!\0"
  12. greska_string:   .ascii "Prazan string!\0"
  13.  
  14. .section .text
  15. .globl main
  16. main:
  17.     movl $4, %eax
  18.     movl $1, %ebx
  19.     leal pocetna_poruka, %ecx
  20.     movl $15, %edx
  21.     int $0x80
  22.  
  23.     movl $3, %eax
  24.     movl $0, %ebx
  25.     leal unos, %ecx
  26.     movl $N, %edx
  27.     int $0x80
  28.  
  29.     xorl %eax, %eax
  30.     leal unos, %eax
  31.     pushl %eax
  32.     call to_int
  33.     cmpl $555, %eax
  34.     je prazan_string
  35.     cmpl $71, %eax
  36.     je pogresan_a
  37.     cmpl $71, %ecx
  38.     je pogresna_op
  39.     cmpl $71, %edx
  40.     je pogresan_b
  41.     addl $4, %esp
  42.    
  43.     pushl %eax
  44.     pushl %ecx
  45.     pushl %edx
  46.     call exe
  47.     addl $12, %esp
  48.    
  49.     xorl %ebx, %ebx
  50.     leal rezultat, %ebx
  51.     pushl %ebx
  52.     pushl %eax
  53.     call to_hex
  54.     addl $8, %esp
  55.    
  56.     movl $4, %eax
  57.     movl $1, %ebx
  58.     leal krajnja_poruka, %ecx
  59.     movl $13, %edx
  60.     int $0x80      
  61.    
  62.     movl $4, %eax
  63.     movl $1, %ebx
  64.     leal rezultat, %ecx
  65.     movl $8, %edx
  66.     int $0x80
  67. kraj:
  68.     movl $1, %eax
  69.     int $0x80
  70.  
  71. pogresan_a:
  72.     movl $4, %eax
  73.     movl $1, %ebx
  74.     leal greska_a, %ecx
  75.     movl $23, %edx
  76.     int $0x80
  77.     jmp kraj
  78.    
  79. pogresan_b:
  80.     movl $4, %eax
  81.     movl $1, %ebx
  82.     leal greska_b, %ecx
  83.     movl $23, %edx
  84.     int $0x80
  85.     jmp kraj
  86. pogresna_op:
  87.     movl $4, %eax
  88.     movl $1, %ebx
  89.     leal greska_op, %ecx
  90.     movl $19, %edx
  91.     int $0x80
  92.     jmp kraj
  93. prazan_string:
  94.     movl $4, %eax
  95.     movl $1, %ebx
  96.     leal greska_string, %ecx
  97.     movl $15, %edx
  98.     int $0x80
  99.     jmp kraj
  100. #======================================================
  101. #program koji konvertuje dati string u interni oblik, izdvaja operande i operaciju, ili samo operande
  102.  
  103. .section .text
  104. .globl to_int
  105. to_int:
  106.     pushl %ebp
  107.     movl %esp, %ebp
  108.     subl $12, %esp  #-4(a), -8(op), -12(b) 
  109.     pushl %esi
  110.     pushl %edi
  111.     pushl %ebx
  112.     movl 8(%ebp), %esi #pokazivac na string
  113.     movl %esi, %edi    #radi poredjenja adresa
  114.     xorl %eax, %eax    #rezultat pri konverziji
  115.     xorl %edx, %edx    #indikator da je prvi operand upisan
  116.     xorl %ebx, %ebx
  117. konvert:
  118.     movb (%esi), %bl
  119.     cmpb $' ', %bl
  120.     je upis_a
  121.     cmpb $10, %bl
  122.     je upis_b
  123. provera:
  124.     cmpl $0, %edx
  125.     je dalje_oktalni
  126.     cmpl $1, %edx
  127.     je dalje_operacija
  128.     cmpl $2, %edx
  129.     je dalje_heksa
  130. dalje_operacija:
  131.     cmpb $'^', %bl
  132.     je upis_op
  133.     cmpb $'&', %bl
  134.     je upis_op
  135.     cmpb $'|', %bl
  136.     je upis_op
  137.     jmp upis_sab
  138. dalje_oktalni:
  139.     cmpb $'0', %bl
  140.     jl set_a
  141.     cmpb $'7', %bl
  142.     jle broj_okt
  143.     jmp set_a
  144.  
  145. dalje_heksa:
  146.     cmpb $'0', %bl
  147.     jl set_b
  148.     cmpb $'9', %bl
  149.     jle broj_heksa
  150.     cmpb $'A', %bl
  151.     jl set_b
  152.     cmpb $'F', %bl
  153.     jle veliko_slovo
  154.     cmpb $'a', %bl
  155.     jl set_b
  156.     cmpb $'f', %bl
  157.     jle malo_slovo
  158.     jmp set_b
  159. vrti:
  160.     incl %esi
  161.     movb (%esi), %bl
  162.     cmpb $' ', %bl
  163.     jne konvert
  164.     jmp vrti
  165. broj_heksa:
  166.     movl $16, %ecx
  167.     subb $'0', %bl
  168.     mull %ecx
  169.     andl %edx, %edx
  170.     jnz set_b
  171.     addl %ebx, %eax
  172.     jmp vrti
  173.    
  174. broj_okt:
  175.     movl $8, %ecx
  176.     subb $'0', %bl 
  177.     mull %ecx
  178.     andl %edx, %edx
  179.     jnz set_a
  180.     addl %ebx, %eax
  181.     incl %esi
  182.     jmp konvert
  183. malo_slovo:
  184.     movl $16, %ecx
  185.     subb $87, %bl
  186.     mull %ecx
  187.     andl %edx, %edx
  188.     jnz set_b
  189.     addl %ebx, %eax
  190.     jmp vrti
  191. veliko_slovo:
  192.     movl $16, %ecx
  193.     subb $55, %bl
  194.     mull %ecx
  195.     andl %edx, %edx
  196.     jnz set_b
  197.     addl %ebx, %eax
  198.     jmp vrti
  199.  
  200. upis_a:
  201.     movl $1, %edx  
  202.     movl %eax, -4(%ebp)
  203.     xorl %eax, %eax
  204.     jmp vrti
  205. upis_b:
  206.     cmpl %esi, %edi
  207.     je set
  208.     movl %eax, -12(%ebp)
  209.     jmp kraj_pp
  210. upis_op:
  211.     movl $2, %edx
  212.     movb %bl, -8(%ebp)
  213.     xorl %eax, %eax
  214.     jmp vrti
  215. upis_sab:
  216.     movl $2, %edx
  217.     movb $'+', -8(%ebp)
  218.     xorl %eax, %eax
  219.     jmp vrti
  220. kraj_pp:
  221.     movl -4(%ebp), %eax
  222.     movl -8(%ebp), %ecx
  223.     movl -12(%ebp), %edx
  224.     popl %ebx
  225.     popl %edi
  226.     popl %esi
  227.     leave
  228.     ret
  229.  
  230. set:
  231.     movl $555, -4(%ebp)  #ako provera u main-u bude ova vrednost, ispis greske o praznom stringu
  232.     jmp kraj_pp
  233.        
  234. set_b:
  235.     movl $71, -12(%ebp)
  236.     jmp kraj_pp    
  237. set_a:
  238.     movl $71, -4(%ebp)
  239.     jmp kraj_pp
  240. set_op:
  241.     movl $71, -8(%ebp)
  242.     jmp kraj_pp
  243. #==========================================
  244.  
  245. #potprogram koji izvrsava odgovarajucu operaciju, vraca rezultat u eax
  246.  
  247. .section .text
  248. .globl exe
  249. exe:
  250.     pushl %ebp
  251.     movl %esp, %ebp
  252.     pushl %esi
  253.     pushl %edi
  254.     pushl %ebx
  255.     movl 8(%ebp), %eax #drugi
  256.     movl 12(%ebp), %ecx #operacija
  257.     movl 16(%ebp), %edx #prvi
  258.    
  259. provera:
  260.     cmpb $'&', %cl
  261.     je do_and
  262.     cmpb $'^', %cl
  263.     je do_xor
  264.     cmpb $'|', %cl
  265.     je do_or
  266.     cmpb $'+', %cl
  267.     je do_add
  268. do_and:
  269.     andl %edx, %eax
  270.     jmp kraj_pp
  271. do_xor:
  272.     xorl %edx, %eax
  273.     jmp kraj_pp
  274. do_or:
  275.     orl %edx, %eax
  276.     jmp kraj_pp
  277. do_add:
  278.     addl %edx, %eax
  279.     notl %eax
  280.     jmp kraj_pp
  281.  
  282. kraj_pp:
  283.     popl %ebx
  284.     popl %edi
  285.     popl %esi
  286.     leave
  287.     ret
  288.  
  289. #================================================
  290. #potprogram koji vraca %eax u heksadecimalni string
  291.  
  292. .section .text
  293. .globl to_hex
  294. to_hex:
  295.     pushl %ebp
  296.     movl %esp, %ebp
  297.     pushl %esi
  298.     pushl %edi
  299.     pushl %ebx
  300.     movl 8(%ebp), %eax #vrednost
  301.     movl 12(%ebp), %esi #pokazivac na string rezultat
  302.     movl %esi, %edi
  303.     movl $16, %ecx
  304.     xorl %ebx, %ebx  #rezultat
  305. konvert:
  306.     xorl %edx, %edx
  307.     divl %ecx # eax= ceo, edx = ostatak
  308.     addb $55, %dl
  309.     movb %dl, (%esi)
  310.     incl %esi
  311.     andl %eax, %eax
  312.     jnz konvert
  313.     movb $0, (%esi)
  314.     decl %esi
  315. obrni:
  316.     cmpl %esi, %edi
  317.     jae kraj_pp
  318.     movb (%edi), %ah
  319.     movb (%esi), %al
  320.     movb %ah, (%esi)
  321.     movb %al, (%edi)
  322.     incl %edi
  323.     decl %esi
  324.     jmp obrni
  325.    
  326. kraj_pp:
  327.     popl %ebx
  328.     popl %edi
  329.     popl %esi
  330.     leave
  331.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement