Advertisement
nex036ara

(2)kalkulator_32bit

May 22nd, 2011
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #program koji demonstrira kalkulator u radu sa 32-bitnim neoznacenim brojevima i tri logicke operacije (unos i ispis u heksadecimalnom brojnom sistemu, na ulazu dozvoljena i velika i mala slova). Program treba da omoguci unos prvog broja, unos logicke operacije i unos drugog broja i da na ekranu ispise rezultat ili poruku o gresci ukoliko dodje do greske (pogresan unos). Ulaz treba da je oblika: heksadecimalni_broj operacija heksadecimalni_broj pri cemu izmedju operacije i heksadecimalnog broja moze postojati jedan ili vise razmaka.
  2. #dozvoljene operacije & (and), | (or) i ^ (xor)
  3.  
  4.  
  5. .section .data
  6.  
  7. N = 100
  8. poruka_pocetak: .ascii "Unesite string:\0"
  9. unos: .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. poruka_kraj: .ascii "Rezultat je:\0"
  14. rezultat: .fill N, 1, 0
  15.  
  16. .section .text
  17. .globl main
  18. main:
  19.     movl $4, %eax
  20.     movl $1, %ebx
  21.     leal poruka_pocetak, %ecx
  22.     movl $20, %edx
  23.     int $0x80
  24.  
  25.     movl $3, %eax
  26.     movl $0, %ebx
  27.     leal unos, %ecx
  28.     movl $N, %edx
  29.     int $0x80
  30.  
  31.  
  32.     xorl %eax, %eax
  33.     leal unos, %eax
  34.    
  35.     pushl %eax
  36.     call char_to_int
  37.     addl $4, %esp
  38.  
  39.     cmpl $71, %eax
  40.     je greska_prvi_operand
  41.     cmpl $71, %ecx
  42.     je pogresna_operacija
  43.     cmpl $71, %edx
  44.     je greska_drugi_operand
  45.    
  46.     pushl %eax
  47.     pushl %ecx
  48.     pushl %edx
  49.     call izvrsi
  50.     addl $12, %esp
  51.  
  52.    
  53.     xorl %ebx, %ebx
  54.     leal rezultat, %ebx
  55.     pushl %eax
  56.     pushl %ebx
  57.     call int_to_char
  58.     addl $8, %esp
  59.    
  60.     movl $4, %eax
  61.     movl $1, %ebx
  62.     leal poruka_kraj, %ecx
  63.     movl $12, %edx
  64.     int $0x80
  65.    
  66.     movl $4, %eax
  67.     movl $1, %ebx
  68.     leal rezultat, %ecx
  69.     movl $12, %edx
  70.     int $0x80
  71.  
  72.    
  73. kraj:
  74.     movl $1, %eax
  75.     int $0x80
  76. greska_prvi_operand:
  77.     movl $4, %eax
  78.     movl $1, %ebx
  79.     leal greska_operand1, %ecx
  80.     movl $20, %edx
  81.     int $0x80
  82.     jmp kraj
  83. greska_drugi_operand:
  84.     movl $4, %eax
  85.     movl $1, %ebx
  86.     leal greska_operand2, %ecx
  87.     movl $20, %edx
  88.     int $0x80
  89.     jmp kraj
  90. pogresna_operacija:
  91.     movl $4, %eax
  92.     movl $1, %ebx
  93.     leal greska_operacija, %ecx
  94.     movl $20, %edx
  95.     int $0x80
  96.     jmp kraj
  97. #===========================================================
  98.  
  99.  
  100. #progran treba da konvertuje uneti string iz znakovnog oblika u interni(baza 16), vrednost ce se sacuvati u %eax
  101.  
  102. .section .text
  103. .globl char_to_int
  104.  
  105. char_to_int:
  106.     pushl %ebp
  107.     movl %esp, %ebp
  108.     subl $16, %esp  #-4()=a  -8()=op  -12()=b  -16()= indikator obrade
  109.     pushl %esi
  110.     pushl %edi
  111.     pushl %ebx
  112.  
  113.     movl 8(%ebp), %esi
  114.     movl %esi, %edi
  115.     movl $16, %ecx
  116.     xorl %eax, %eax #rezultat
  117.     xorl %ebx, %ebx #karakter
  118.     xorl %edx, %edx #greska
  119.     movl $0, -16(%ebp) #indikator obrade
  120. konvert:
  121.     movb (%esi), %bl
  122.     cmpb $' ', %bl
  123.     jne dalje
  124. provera_vrti:
  125.     cmpl $0, -16(%ebp)
  126.     je vrti1
  127.    
  128. dalje: 
  129.     cmpl $1, -16(%ebp)
  130.     je provera_operacije
  131.  
  132.     cmpb $10, %bl
  133.     je kraj_hexa
  134.    
  135.     cmpb $'0', %bl
  136.     jl set
  137.     cmpb $'9', %bl
  138.     jle broj
  139.    
  140.     cmpb $'A', %bl
  141.     jl set
  142.     cmpb $'F', %bl
  143.     jle veliko_slovo
  144.        
  145.    
  146.     cmpb $'a', %bl
  147.     jl set
  148.     cmpb $'f', %bl
  149.     jle malo_slovo
  150.  
  151. vrti1:
  152.     movl $1, -16(%ebp)
  153.     movl %eax, -4(%ebp)
  154.     movl $1, %edx  #indikator da greska nije kod prvog operanda
  155.     incl %esi
  156.     movb (%esi), %bl
  157.     cmpb $' ', %bl
  158.     je vrti1
  159.     xorl %eax, %eax
  160.     jmp konvert
  161. provera_operacije:
  162.     movl $2, -16(%ebp)
  163.     cmpb $'^', %bl
  164.     je vrti2
  165.     cmpb $'&', %bl
  166.     je vrti2
  167.     cmpb $'|', %bl
  168.     je vrti2
  169.     jmp set
  170. vrti2:
  171.     movb %bl, -8(%ebp)
  172.     movl $2, %edx #indikator da greska nije kod operacije
  173. vrtic:
  174.     incl %esi
  175.     movb (%esi), %bl
  176.     cmpb $' ', %bl
  177.     je vrtic
  178.     xorl %eax, %eax
  179.     jmp konvert
  180. broj:
  181.     subb $'0', %bl
  182.     mull %ecx
  183.     andl %edx, %edx
  184.     jnz set
  185.     addl %ebx, %eax
  186.     jc set
  187.     incl %esi
  188.     jmp konvert
  189.    
  190. malo_slovo:
  191.     subb $87, %bl
  192.     mull %ecx
  193.     andl %edx, %edx
  194.     jnz set
  195.     addl %ebx, %eax
  196.     jc set
  197.     incl %esi
  198.     jmp konvert
  199.  
  200. veliko_slovo:
  201.     subb $55, %bl
  202.     mull %ecx
  203.     andl %edx, %edx
  204.     jnz set
  205.     addl %ebx, %eax
  206.     jc set
  207.     incl %esi
  208.     jmp konvert
  209.  
  210. kraj_hexa:
  211.     movl %eax, -12(%ebp)
  212.     cmpl %esi, %edi
  213.     jne kraj_pp
  214. set:
  215.     cmpl $0, %edx
  216.     je set_operand1
  217.     cmpl $1, %edx
  218.     je set_operacija
  219.     jmp set_operand2
  220. set_operand1:
  221.     movl $71, -4(%ebp)
  222.     jmp kraj_pp
  223. set_operacija:
  224.     movl $71, -8(%ebp)
  225.     jmp kraj_pp
  226. set_operand2:
  227.     movl $71, -12(%ebp)
  228.     jmp kraj_pp
  229. kraj_pp:
  230.     movl -4(%ebp), %eax  #prvi operand
  231.     movl -8(%ebp), %ecx  #operacija
  232.     movl -12(%ebp), %edx #drugi operand
  233.     popl %ebx
  234.     popl %edi
  235.     popl %esi
  236.     leave
  237.     ret
  238.  
  239.    
  240. #===================================================
  241. #program koji izvrsava datu operaciju
  242.  
  243. .section .text
  244. .globl izvrsi
  245. izvrsi:
  246.     pushl %ebp
  247.     movl %esp, %ebp
  248.     pushl %ebx
  249.    
  250.     movl 8(%ebp), %eax #drugi operand
  251.     movl 12(%ebp), %ebx #operacija
  252.     movl 16(%ebp), %ecx #prvi
  253. operacija:
  254.     cmpb $'^', %bl
  255.     je xor_op
  256.     cmpb $'&', %bl
  257.     je and_op
  258.     cmpb $'|', %bl
  259.     je or_op
  260.     jmp set
  261. xor_op:
  262.     xorl %ecx, %eax
  263.     jmp kraj_pp
  264. and_op:
  265.     andl %ecx, %eax
  266.     jmp kraj_pp
  267. or_op:
  268.     orl %ecx, %eax
  269.     jmp kraj_pp
  270.  
  271. kraj_pp:
  272.     popl %ebx
  273.     leave
  274.     ret
  275. set:
  276.     movl $0, %edx
  277.     jmp kraj_pp
  278.  
  279. #=====================================================
  280.  
  281. #program koji vraca vrednost %eax u string
  282.  
  283. .section .text
  284. .globl int_to_char
  285. int_to_char:
  286.     pushl %ebp
  287.     movl %esp, %ebp
  288.     pushl %ebx
  289.     pushl %edi
  290.     pushl %esi
  291.  
  292.     movl 8(%ebp), %esi
  293.     movl %esi, %edi
  294.     movl 12(%ebp), %eax
  295.     movl $16, %ecx
  296.     xorl %ebx, %ebx
  297. obavi:
  298.     xorl %edx, %edx
  299.     divl %ecx  #edx:eax / %ecx = eax, ostatak u edx
  300.     addb $55, %dl
  301.     movb %dl, (%esi)
  302.     incl %esi
  303.     andl %eax, %eax
  304.     jnz obavi
  305.     movb $0, (%esi)
  306.     decl %esi
  307. obrni:
  308.     cmpl %esi, %edi
  309.     jae kraj_pp
  310.     movb (%edi), %ah
  311.     movb (%esi), %al
  312.     movb %ah, (%esi)
  313.     movb %al, (%edi)
  314.     incl %edi
  315.     decl %esi
  316.     jmp obrni
  317. kraj_pp:
  318.     popl %esi
  319.     popl %edi
  320.     popl %ebx
  321.     leave
  322.     ret
  323.  
  324.     popl %ebx
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement