Advertisement
nex036ara

(1)kalkulator_32bit

May 22nd, 2011
192
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. .section .data
  5. N = 50
  6. poruka1: .ascii "Unesite izraz:\0"
  7. unos: .fill N,1,0
  8. greska1: .ascii "Pogresan prvi operand!\0"
  9. greska2: .ascii "Pogresan drugi operand!\0"
  10. greska3: .ascii "Pogresna operacija!\0"
  11. poruka2: .ascii "Rezultat je:\0"
  12. rezultat: .fill N,1,0
  13. .section .text
  14. .globl main
  15. main:
  16.  
  17.     movl $4, %eax
  18.     movl $1, %ebx
  19.     leal poruka1, %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.    
  30.     xorl %eax, %eax  
  31.     leal unos, %eax
  32.    
  33.     pushl %eax
  34.     call konvert_string
  35.    
  36.     cmpl $0, %edx
  37.     je greska_operacija
  38.     cmpl $0, %eax
  39.     je greska_operanda1
  40.     cmpl $0, %ecx
  41.     je greska_operanda2
  42.     addl $4, %esp
  43.    
  44.  
  45.  
  46.     pushl %ecx    #drugi operand    
  47.     pushl %edx     #operacija
  48.     pushl %eax     #prvi operand  
  49.     call obavi
  50.     movl %eax, %edx
  51.     addl $12, %esp
  52.  
  53.  
  54.     xorl %ebx, %ebx
  55.     leal rezultat, %ebx
  56.     pushl %edx
  57.     pushl %ebx
  58.     call u_interni
  59.     addl $8, %esp
  60.    
  61.    
  62.     movl $4, %eax
  63.     movl $1,%ebx
  64.     leal poruka2, %ecx
  65.     movl $N, %edx
  66.     int $0x80
  67.    
  68.    
  69.    
  70. kraj:
  71.     movl $1, %eax
  72.     int $0x80
  73.    
  74. greska_operacija:
  75.     movl $4, %eax
  76.     movl $1, %ebx
  77.     leal greska3, %ecx
  78.     movl $N, %edx
  79.     int $0x80
  80.     jmp kraj   
  81. greska_operanda1:
  82.     movl $4, %eax
  83.     movl $1, %ebx
  84.     leal greska1, %ecx
  85.     movl $N, %edx
  86.     int $0x80
  87.     jmp kraj
  88. greska_operanda2:
  89.     movl $4, %eax
  90.     movl $1, %ebx
  91.     leal greska2, %ecx
  92.     movl $N, %edx
  93.     int $0x80
  94.     jmp kraj
  95.  
  96. #==============================================================
  97.  
  98.  
  99.  
  100.  
  101.  
  102. #program koji konvertuje string iz znakovnog u interni(baza16)
  103.  
  104.  
  105.  
  106. .section .text
  107. .globl konvert_string
  108. konvert_string:
  109.     pushl %ebp
  110.     movl %esp, %ebp
  111.     subl $12,%esp// -4 b1, -8 op -12 b2
  112.     pushl %esi
  113.     pushl %edi
  114.     pushl %ebx
  115.  
  116.    
  117.     movl 8(%ebp), %esi #adresa stringa
  118.     movl %esi, %edi
  119.     xorl %eax, %eax
  120.     movl $16, %ecx
  121. nadji_broj:
  122.     movb (%esi), %bl
  123.     cmpb $' ', %bl
  124.     je dalje
  125.     cmpb $10, %bl
  126.     je kraj_heksa
  127.  
  128.     cmpb $'0', %bl
  129.     jl set
  130.     cmpb $'9', %bl
  131.     jle broj
  132.     cmpb $'A', %bl
  133.     jl set
  134.     cmpb $'F', %bl
  135.     jle veliko_slovo
  136.     cmpb $'a', %bl
  137.     jl set
  138.     cmpb $'f', %bl
  139.     jle malo_slovo
  140.     cmpb $0, %dl
  141.     jne set2
  142. set:
  143.     xorl %edx, %edx
  144.     movb $0, -4(%ebp)
  145.     jmp kraj_pp
  146. set2:
  147.     movb $0, -12(%ebp)
  148.     jmp kraj_pp
  149. dalje:
  150.     movl %eax, -4(%ebp)  #prvi broj
  151.     xorl %eax, %eax
  152. nadji_operaciju:
  153.     incl %esi
  154.     movb (%esi), %bl
  155.     cmpb $' ', %bl
  156.     je nadji_operaciju
  157.     cmpb $'^', %bl
  158.     je nadji_xor
  159.     cmpb $'&', %bl
  160.     je nadji_and
  161.     cmpb $'|', %bl
  162.     je nadji_ili
  163. set_op:
  164.     movb $0, -8(%ebp)
  165.     jmp kraj_pp
  166.  
  167. veliko_slovo:
  168.     subb $55, %bl
  169.     mull %ecx
  170.     addl %ebx, %eax
  171.     incl %esi
  172.     jmp nadji_broj
  173.    
  174. malo_slovo:
  175.     subb $87, %bl
  176.     mull %ecx
  177.     addl %ebx, %eax
  178.     incl %esi
  179.     jmp nadji_broj
  180. broj:
  181.     subb $'0', %bl
  182.     mull %ecx
  183.     addl %ebx, %eax
  184.     incl %esi
  185.     jmp nadji_broj
  186.  
  187. nadji_xor:
  188.     movb $'^',  -8(%ebp)
  189.     jmp nadji_drugi_broj
  190. nadji_and:
  191.     movb $'&', -8(%ebp)
  192.     jmp nadji_drugi_broj
  193. nadji_ili:
  194.     movb $'|', -8(%ebp)
  195.  
  196. nadji_drugi_broj:
  197.     incl %esi
  198.     movb (%esi), %bl
  199.     cmpb $' ', %bl
  200.     je nadji_drugi_broj
  201.     jmp nadji_broj
  202.  
  203. kraj_heksa:
  204.     movl %eax, -12(%ebp)  #drugi broj
  205.         cmpl %edi, %esi #'\0' na poÄŤetku stringa?
  206.         je set
  207.    
  208. kraj_pp:
  209.     movl -4(%ebp), %eax #prvi broj
  210.     movl -8(%ebp), %edx #operacija
  211.     movl -12(%ebp), %ecx #drugi broj
  212.         popl %ebx
  213.         popl %edi
  214.         popl %esi
  215.         leave
  216.         ret
  217.  
  218. #============================================================
  219. #potprogram koji obavlja operaciju
  220.  
  221. .section .text
  222. .globl obavi
  223. obavi:
  224.     pushl %ebp
  225.     movl %esp, %ebp
  226.     subl $4, %esp
  227.     pushl %ebx
  228.     pushl %esi
  229.     pushl %edi
  230.    
  231.     movl 8(%ebp), %eax #prvi operand
  232.     movl 12(%ebp), %ebx #operacija
  233.     movl 16(%ebp), %ecx #drugi operand
  234.    
  235. provera_operacije:
  236.     cmpb $'&', %bl
  237.     je and_op
  238.     cmpb $'|', %bl
  239.     je or_op
  240.     cmpb $'^', %bl
  241.     je xor_op
  242. and_op:
  243.     andl %ecx, %eax
  244.     jmp kraj_pp
  245. or_op:
  246.     orl %ecx, %eax
  247.     jmp kraj_pp
  248. xor_op:
  249.     xorl %ecx, %eax
  250. kraj_pp:
  251.     popl %edi
  252.     popl %esi
  253.     popl %ebx
  254.     leave
  255.     ret
  256.        
  257. #===============================================================
  258.  
  259. #potprogram koji vraca rezultat iz internog u znakovni
  260.  
  261. .section .text
  262. .globl u_interni
  263.  
  264. u_interni:
  265.     pushl %ebp
  266.     movl %esp, %ebp
  267.     pushl %esi
  268.     pushl %edi
  269.     pushl %ebx
  270.    
  271.     movl 8(%ebp), %esi   #adresa rezultujuceg stringa
  272.     movl %esi, %edi
  273.     movl 12(%ebp), %eax  #broj koji se konvertuje
  274.     movl $16, %ecx
  275. heksa_cifra:
  276.         xorl %edx, %edx
  277.         divl %ecx
  278.         cmpb $9, %dl
  279.     ja slovo
  280.     addb $'0', %dl
  281.         movb %dl, (%esi)
  282.         incl %esi
  283.         andl %eax, %eax
  284.         jnz heksa_cifra
  285.         movb $0, (%esi)
  286.         decl %esi
  287. obrni:
  288.     cmpl %esi, %edi
  289.     jae kraj
  290.     movb (%esi), %ah
  291.     movb (%edi), %al
  292.     movb %al, (%esi)
  293.     movb %ah, (%edi)
  294.     decl %esi
  295.     incl %edi
  296.     jmp obrni
  297.  
  298. slovo:
  299.     addb $55, %dl
  300.     movb %dl, (%esi)
  301.     incl %esi
  302.     andl %eax, %eax
  303.     jmp heksa_cifra
  304.     movb $0, (%esi)
  305.     decl %esi
  306.     jmp obrni
  307.    
  308. kraj:
  309.     popl %ebx
  310.     popl %esi
  311.     popl %edi
  312.     leave
  313.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement