Wydanie R2019.06.1
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
asm-printf-scanf: asm-printf-scanf.s kwadrat.c
|
||||
gcc -g asm-printf-scanf.s kwadrat.c -o asm-printf-scanf -no-pie
|
||||
|
||||
all: asm-printf-scanf
|
||||
|
||||
clean:
|
||||
rm -f asm-printf-scanf
|
||||
@@ -0,0 +1,72 @@
|
||||
# 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
|
||||
@@ -0,0 +1,6 @@
|
||||
double kwadrat(int x, double y)
|
||||
{
|
||||
double z = x*x + y*y;
|
||||
|
||||
return z;
|
||||
}
|
||||
Reference in New Issue
Block a user