123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- # Jan Potocki 2019
-
- .data
- # Definicje numerow funkcji systemowych i ich parametrow
- SYSEXIT = 60
- SYSREAD = 0
- SYSWRITE = 1
- STDIN = 0
- STDOUT = 1
- STDERR = 2
-
- # Stale
- liczba = 130 # Liczba calkowita do wypisania przez printf
-
- # Ciagi formatujace dla scanf
- int1: .asciz "%ld" # 64-bit int
- double1: .asciz "%lf" # 64-bit double
-
- # Ciagi formatujace dla printf
- int2: .asciz "%ld\n" # 64-bit int
- double2: .asciz "%f\n" # 64-bit double (w printf nie "%lf"!)
-
- .bss
- # Zmienne
- x: .space 8 # 64-bit int
- y: .space 8 # 64-bit double
- wynik: .space 8 # 64-bit double
-
- .text
- .globl main
-
- main:
- pushq %rbp # Wyrownanie stosu (alignment) - wymagane przez
- # konwencje wywolan
-
- # Wczytanie danych
- movb $0, %al # Brak parametrow w rejestrach wektorowych
- movq $int1, %rdi # Ciag formatujacy
- movq $x, %rsi # Wskaznik na x
- call scanf
-
- movb $0, %al # Brak parametrow w rejestrach wektorowych
- movq $double1, %rdi # Ciag formatujacy
- movq $y, %rsi # Wskaznik na y
- call scanf
-
- # Wywolanie funkcji w C
- movq (x), %rdi # Przekazanie x (1. parametr, int) przez wartosc
- movq (y), %xmm0 # Przekazanie y (2. parametr, double) przez wartosc
- # Liczby rejestrow wektorowych w al nie ustawiamy, bo nasza funkcja przyjmuje
- # stala liczbe parametrow (inaczej niz printf czy scanf)
- call kwadrat
- # Wynik zostanie zwrocony w rejestrze xmm0, ktorym rowniez przekazuje sie go do
- # funkcji printf - wiec nic nie trzeba z nim robic
-
- # Wypisanie wyniku
- movb $1, %al # 1 parametr w rejestrze wektorowym (xmm0)
- movq $double2, %rdi # Ciag formatujacy
- call printf
-
- # Wypisanie liczby calkowitej ustawionej w stalej
- movb $0, %al # Brak parametrow w rejestrach wektorowych
- movq $int2, %rdi # Ciag formatujacy
- movq $liczba, %rsi # Przekazanie stalej przez wartosc
- call printf
-
- popq %rbp # Przywrocenie stosu do poprzedniego stanu
-
- # Koniec programu
- movq $SYSEXIT, %rax
- movq $0, %rdi
- syscall
|