Advertisement
nex036ara

checksum

May 22nd, 2011
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #program koji u zavisnosti od znaka operacije racuna kontrolnu sumu (c) unetih brojnih vrednosti. Prvi operand je heksadecimalni(dozvoljena mala slova i velika), drugi je oktalni, izlaz je binarni.
  2. #ukoliko dodje do pogresnog unosa ispisati odgovarajucu poruku. Korektan unos operacije je karakter 'c'
  3.  
  4. .section .data
  5. N = 35
  6. pocetak: .ascii "Unesite izraz:\0"
  7. unos: .fill N,1,0
  8. kraj_string: .ascii "Rezultat je:\0"
  9. rezultat: .fill N,1,0
  10. greska_operand1:  .ascii "Pogresan prvi operand!\0"
  11. greska_operacija: .ascii "Pogresna operacija!\0"
  12. greska_operand2:  .ascii "Pogresan drugi operand!\0"
  13. prazan_string: .ascii "Uneli ste prazan string!\0"
  14. .section .text
  15. .globl main
  16. main:
  17.     movl $4, %eax
  18.     movl $1, %ebx
  19.     leal pocetak, %ecx
  20.     movl $20, %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 char_to_int
  33.     cmpl $101, %eax
  34.     je greska_string
  35.     cmpl $71, %eax
  36.     je greska_operanda1
  37.     cmpl $71, %ecx
  38.     je greska_operacije
  39.     cmpl $71, %edx
  40.     je greska_operanda2
  41.     addl $4, %esp
  42.    
  43.     pushl %eax
  44.     pushl %edx
  45.     call checksum
  46.     addl $8, %esp
  47.    
  48.    
  49.     xorl %ebx, %ebx
  50.     leal rezultat, %ebx
  51.     pushl %ebx
  52.     pushl %eax
  53.     call int_to_char
  54.     addl $8, %esp
  55.  
  56.     movl $4, %eax
  57.     movl $1, %ebx
  58.     leal kraj_string, %ecx
  59.     movl $N, %edx
  60.     int $0x80  
  61.    
  62.    
  63.    
  64.  
  65. kraj:
  66.     movl $1, %eax
  67.     int $0x80
  68.  
  69. greska_operanda1:
  70.     movl $4, %eax
  71.     movl $1, %ebx
  72.     leal greska_operand1, %ecx
  73.     movl $22, %edx
  74.     int $0x80
  75.     jmp kraj
  76. greska_operacije:
  77.     movl $4, %eax
  78.     movl $1, %ebx
  79.     leal greska_operacija, %ecx
  80.     movl $19, %edx
  81.     int $0x80
  82.     jmp kraj
  83. greska_operanda2:
  84.     movl $4, %eax
  85.     movl $1, %ebx
  86.     leal greska_operand2, %ecx
  87.     movl $23, %edx
  88.     int $0x80
  89.     jmp kraj
  90. greska_string:
  91.     movl $4, %eax
  92.     movl $1, %ebx
  93.     leal prazan_string, %ecx
  94.     movl $24, %edx
  95.     int $0x80
  96.     jmp kraj
  97. #==============================================================
  98.  
  99. #potprogram koji konvertuje uneti string, i kao vrednost daje interni oblik u registar eax
  100. #konvertuje heksadecimalni, prepoznaje karakter, konvertuje binarni
  101. .section .text
  102. .globl char_to_int
  103. char_to_int:
  104.     pushl %ebp
  105.     movl %esp, %ebp
  106.     subl $16, %esp   # -4(a) -8(operacija) -12(operand) -16(greska)
  107.     pushl %esi
  108.     pushl %edi
  109.     pushl %ebx
  110.    
  111.     movl 8(%ebp), %esi
  112.     movl %esi, %edi # zbog poredjenja adresa
  113.     xorl %eax, %eax #rezultat
  114.     xorl %ebx, %ebx #karakter
  115.     xorl %edx, %edx #indikator da je upisan prvi operand
  116.     movl $0, -16(%ebp) #greska
  117.     movl $16, %ecx
  118. konvert:
  119.     movb (%esi), %bl
  120.     cmpb $' ', %bl
  121.     je upisi_a
  122.     cmpb $10, %bl
  123.     je kraj_string
  124.  
  125. provera_operacije:
  126.     cmpl $1, %edx
  127.     jne dalje
  128.     cmpb $99, %bl
  129.     jne set_op
  130.     movb %bl, -8(%ebp)
  131. do_oktalnog:   
  132.     incl %esi
  133.     movb (%esi), %bl
  134.     cmpb $' ',  %bl
  135.     jne nadji_oktalni
  136.     jmp do_oktalnog
  137. dalje:
  138.     cmpb $'0', %bl
  139.     je set
  140.     cmpb $'9', %bl
  141.     jle broj
  142.     cmpb $'A', %bl
  143.     jl set
  144.     cmpb $'F', %bl
  145.     jle veliko_slovo
  146.     cmpb $'a', %bl
  147.     jl set
  148.     cmpb $'f', %bl
  149.     jle malo_slovo
  150. set:
  151.     movl $71, -4(%ebp)
  152.     jmp kraj_pp
  153. set_b:
  154.     movl $71, -12(%ebp)
  155.     jmp kraj_pp
  156. set_op:
  157.     movl $71, -8(%ebp)
  158.     jmp kraj_pp
  159. setup:
  160.     movl $101, -16(%ebp)
  161.     jmp kraj_ppp
  162. nadji_oktalni:
  163.     xorl %eax, %eax
  164.     movl $8, %ecx
  165. nastavi_oktalni:
  166.     cmpb $10, %bl
  167.     jne dalje_okt
  168.     movl %eax, -12(%ebp)
  169.     jmp kraj_pp
  170. dalje_okt:
  171.     subb $'0', %bl
  172.     jc set_b
  173.     cmpb $8, %bl
  174.     ja set_b
  175.     mull %ecx
  176.     andl %edx, %edx
  177.     jnz set_b
  178.     addl %ebx, %eax
  179.     jc set_b
  180.     incl %esi
  181.     movb (%esi), %bl
  182.     jmp nastavi_oktalni
  183.  
  184. kraj_string:
  185.     cmpl %esi, %edi
  186.     jne kraj_pp
  187.     jmp setup
  188.    
  189.        
  190. broj:  
  191.     subb $'0', %bl
  192.     mull %ecx
  193.     andl %edx, %edx
  194.     jnz set
  195.     addl %ebx, %eax
  196.     jc set
  197. do_operacije:
  198.     incl %esi
  199.     movb (%esi), %bl
  200.     jmp konvert
  201. upisi_a:
  202.     movl %eax, -4(%ebp) #upis prvog operanda
  203.     movl $1, %edx
  204.     incl %esi
  205.     jmp konvert
  206. malo_slovo:
  207.     subb $87, %bl
  208.     mull %ecx
  209.     andl %edx, %edx
  210.     jnz set
  211.     addl %ebx, %eax
  212.     jc set
  213.     jmp do_operacije
  214.  
  215. veliko_slovo:
  216.     subb $55, %bl
  217.     mull %ecx
  218.     andl %edx, %edx
  219.     jnz set
  220.     addl %ebx, %eax
  221.     jc set
  222.     jmp do_operacije
  223.  
  224. kraj_pp:
  225.     movl -4(%ebp), %eax
  226.     movl -8(%ebp), %ecx
  227.     movl -12(%ebp), %edx
  228.      
  229.     popl %ebx
  230.     popl %edi
  231.     popl %esi
  232.     leave
  233.     ret
  234. kraj_ppp:
  235.     movl -16(%ebp), %eax
  236.     popl %ebx
  237.     popl %edi
  238.     popl %esi
  239.     leave
  240.     ret
  241.    
  242. #==============================================================
  243.  
  244. #potprogram koji promalazi kontrolnu sumu dva interna broja
  245.  
  246. .section .text
  247. .globl checksum
  248. checksum:
  249.     pushl %ebp
  250.     movl %esp, %ebp
  251.     pushl %esi
  252.     pushl %edi
  253.     pushl %edx
  254.    
  255.     movl 8(%ebp), %ebx #drugi operand
  256.     movl 12(%ebp), %ecx #prvi operand
  257.     xorl %eax, %eax   #kontrolna suma
  258.     movl $1, %edx    #maska
  259.  
  260. sledeci_element:
  261.     xorl %esi, %esi #brojac jedinica
  262.    
  263. kontrola1:
  264.     andl %edx, %ecx
  265.     jz kontrola2
  266.     incl %esi
  267. kontrola2:
  268.     andl %edx, %ebx
  269.     jz suma
  270.     incl %esi
  271. suma:
  272.     shrl $1, %esi
  273.     rcrl $1, %eax
  274.     shll $1, %edx
  275.     jnc sledeci_element
  276.    
  277. kraj_pp:
  278.     popl %edx
  279.     popl %edi
  280.     popl %esi
  281.     leave
  282.     ret
  283. #===================================================
  284.  
  285. #potprogram koji konvertuje dobijenu kontrolnu sumu iz internog u znakovni oblik(binarna pretstava)
  286.  
  287. .section .text
  288. .globl int_to_char
  289. int_to_char:
  290.     pushl %ebp
  291.     movl %esp, %ebp
  292.     pushl %esi
  293.     pushl %edi
  294.     pushl %ebx
  295.    
  296.     movl 8(%ebp), %eax #vrednos koja se konvertuje
  297.     movl 12(%ebp), %esi  #adresa rezultujuceg stringa
  298.     movl %esi, %edi
  299. konvert:
  300.     shrl $1, %eax
  301.     rclb $1, %bl
  302.     andb $1, %bl
  303.     addb $'0', %bl
  304.     movb %bl, (%esi)
  305.     incl %esi
  306.     andl %eax, %eax
  307.     jnz konvert
  308.     movb $0, (%esi)
  309.     decl %esi
  310. obrni:
  311.     cmpl %esi, %edi
  312.     jae kraj_pp
  313.     movb (%edi), %ah
  314.     movb (%esi), %al
  315.     movb %ah, (%esi)
  316.     movb %al, (%edi)
  317.     incl %edi
  318.     decl %esi
  319.     jmp obrni
  320. kraj_pp:
  321.     popl %ebx
  322.     popl %edi
  323.     popl %esi
  324.     leave
  325.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement