73 lines
2.0 KiB
ArmAsm
73 lines
2.0 KiB
ArmAsm
# 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
|