Advertisement
Guest User

calculator.asm

a guest
Jul 5th, 2018
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. global main
  2. extern printf
  3. extern scanf
  4. extern puts
  5. extern exit
  6.  
  7. section .text
  8. main:
  9.     mov ebp, esp        ; ebp --> entry point
  10.     sub esp, 16         ; rezerwacja 16 bajtow na 4 zmienne potrzebne w programie (inty rozmiar 4 bajtow)
  11.    
  12.     mov dword [ebp-12], 0   ; int wybor = 0
  13.     mov dword [ebp-8]0   ; int liczba1 = 0
  14.     mov dword [ebp-4]0   ; int liczba2 = 0
  15.     mov dword [ebp],    0   ; int wynik = 0
  16.     push calc_msg          
  17.     call printf            
  18.     add esp, 4
  19.     push choice_msg        
  20.     call printf
  21.     add esp, 4
  22.     push choices
  23.     call puts
  24.     add esp, 4
  25.     push next_choice_msg
  26.     call printf
  27.     add esp, 4
  28.     lea eax, [ebp-12]               ; oblicz offset [ebp-12] i wloz do eax
  29.     push eax                        ; (&wybor)
  30.     push format_int                 ; ("%i")
  31.     call scanf                      ; scanf("%i", &wybor)
  32.     add esp, 8
  33.     push write_first_number_msg     ; 'Write first number: '
  34.     call printf
  35.     add esp, 4
  36.     lea eax, [ebp-8]                ; oblicz offset [ebp-8] i wloz do eax
  37.     push eax                        ; (&liczba1)
  38.     push format_int                 ; ("%i")
  39.     call scanf                      ; scanf("%i", &liczba1)
  40.     add esp, 8
  41.     push write_second_number_msg    ; 'Write second number: '
  42.     call printf
  43.     add esp, 4                 
  44.     lea eax, [ebp-4]                ; oblicz offset [ebp-4] i wloz do eax
  45.     push eax                        ; (&liczba1)
  46.     push format_int                 ; ("%i")
  47.     call scanf                      ; scanf("%i", &liczba2)
  48.     add esp, 8
  49.  
  50.     ; zaczyna sie cos jak switch case w C
  51.  
  52.     mov eax, [ebp-12]               ; eax --> *(wybor)
  53.     cmp eax, 2                     
  54.     jz subtraction
  55.     cmp eax, 2
  56.     jg cmp_with_3_label
  57.     cmp eax, 1
  58.     jz addition
  59.     jmp default_label
  60.  
  61.     cmp_with_3_label:
  62.         cmp eax, 3
  63.         jz multiplication
  64.         jmp cmp_with_4_label
  65.  
  66.     cmp_with_4_label:
  67.         cmp eax, 4
  68.         jz divide
  69.         jmp default_label
  70.  
  71.     subtraction:
  72.         mov eax, [ebp-8]    ; eax --> *(liczba1)
  73.         sub eax, [ebp-4]    ; eax --> *(liczba1) - *(liczba2)
  74.         mov [ebp], eax      ; *(wynik) = *(liczba1) - *(liczba2)
  75.         jmp write_result
  76.  
  77.     addition:
  78.         mov eax, [ebp-8]
  79.         add eax, [ebp-4]    ; eax --> *(liczba1) + *(liczba2)
  80.         mov [ebp], eax
  81.         jmp write_result
  82.  
  83.     multiplication:
  84.         mov eax, [ebp-8]
  85.         imul eax            ; eax --> *(liczba1) * *(liczba2) (instrukcja imul, bo dzialamy na signed int)
  86.         mov [ebp], eax
  87.         jmp write_result
  88.  
  89.     divide:
  90.         mov eax, [ebp-8]
  91.         idiv eax            ; eax --> *(liczba1) / *(liczba2) (instrukcja idiv, bo dzialamy na signed int)
  92.         mov [ebp], eax
  93.         jmp write_result
  94.  
  95.     default_label:
  96.         push bad_option
  97.         call puts           ; puts, bo na koniec \n co powoduje wyczyszczenie bufora
  98.         add esp, 4
  99.         call exit
  100.  
  101.     write_result:
  102.         push dword [ebp]
  103.         push write_result_msg
  104.         call printf
  105.         add esp, 8
  106.         call exit
  107.  
  108. section .data
  109. calc_msg db "~~~~~~~~CALCULATOR~~~~~~~~", 0xa, 0
  110. choice_msg db "Choose one of the operation", 0xa, 0
  111. choices db "1. Addition", 0xa
  112.         db "2. Subtraction", 0xa
  113.         db "3. Multiplication", 0xa
  114.         db "4. Divide", 0
  115. next_choice_msg db "Your choice: ", 0
  116. write_first_number_msg db "Write first number: ", 0
  117. write_second_number_msg db "Write second number: ", 0
  118. bad_option db "You chose bad option.", 0
  119. write_result_msg db "Result: %i", 0xa, 0
  120. format_int db "%i", 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement