Quellcode durchsuchen

Wydanie R2019.06.1

Jan Potocki vor 5 Jahren
Commit
e74d77ce3b
10 geänderte Dateien mit 418 neuen und 0 gelöschten Zeilen
  1. 10
    0
      lab3/Makefile
  2. 101
    0
      lab3/rekurencja-reg.s
  3. 101
    0
      lab3/rekurencja-stack.s
  4. 7
    0
      lab4/Makefile
  5. 72
    0
      lab4/asm-printf-scanf.s
  6. 6
    0
      lab4/kwadrat.c
  7. 8
    0
      lab5/Makefile
  8. 62
    0
      lab5/arctg.s
  9. 26
    0
      lab5/arctgc.c
  10. 25
    0
      lab5/fpu.c

+ 10
- 0
lab3/Makefile Datei anzeigen

@@ -0,0 +1,10 @@
1
+rekurencja-reg: rekurencja-reg.s
2
+	gcc -g rekurencja-reg.s -o rekurencja-reg -no-pie
3
+
4
+rekurencja-stack: rekurencja-stack.s
5
+	gcc -g rekurencja-stack.s -o rekurencja-stack -no-pie
6
+
7
+all: rekurencja-reg rekurencja-stack
8
+
9
+clean:
10
+	rm -f rekurencja-reg rekurencja-stack

+ 101
- 0
lab3/rekurencja-reg.s Datei anzeigen

@@ -0,0 +1,101 @@
1
+# Jan Potocki 2019
2
+
3
+# Definicje numerow funkcji systemowych i ich parametrow
4
+SYSEXIT = 60
5
+SYSREAD = 0
6
+SYSWRITE = 1
7
+STDIN = 0
8
+STDOUT = 1
9
+STDERR = 2
10
+
11
+# Stale
12
+number = 5              # Wyraz ciagu (to mozna zmienic, reszty nie ruszac)
13
+
14
+n_size = 8              # Rozmiar bufora
15
+
16
+.bss
17
+num: .space n_size      # Bufor
18
+
19
+.text
20
+.globl main
21
+
22
+fun:
23
+# Funkcja obliczajaca wynik ciagu:
24
+# x_0=2
25
+# x_1=1
26
+# x_2=3
27
+# x_i=x_(i-2) - 2*x_(i-3)
28
+# 1 parametr - wyraz ciagu (64-bit int), przekazywany przez rejestr
29
+# Wynik zwracany przez rejestr
30
+
31
+pushq %rbp              # Wejscie do funkcji
32
+movq %rsp, %rbp
33
+pushq %rbx              # Zachowanie wartosci rejestru rbx, poniewaz bedzie
34
+                        # pozniej modyfikowany - a wg konwencji wywolan, rbx 
35
+                        # musi byc zachowany po stronie wywolanej funkcji
36
+
37
+cmpq $0, %rdi           # rdi - 1. parametr (zgodnie z konwencja wywolan)
38
+je x0
39
+cmpq $1, %rdi
40
+je x1
41
+cmpq $2, %rdi
42
+je x2
43
+
44
+# Rekurencja
45
+# 1 wyraz
46
+subq $2, %rdi           # Obliczenie indeksu nowego wyrazu ciagu
47
+pushq %rdi              # Zachowanie wartosci rejestru rdi (wg konwencji
48
+                        # wywolan - po stronie wywolujacego)
49
+call fun                # 1. wywolanie rekurencyjne
50
+popq %rdi               # Przywrocenie wartosci rejestru rdi
51
+movq %rax, %rbx         # Skopiowanie wyniku zwroconego w rejestrze rax
52
+                        # do rejestru rbx
53
+
54
+# 2 wyraz
55
+subq $1, %rdi           # Obliczenie indeksu nowego wyrazu ciagu
56
+pushq %rdi              # Zachowanie wartosci rejestru rdi (wg konwencji
57
+                        # wywolan - po stronie wywolujacego)
58
+call fun                # 1. wywolanie rekurencyjne
59
+popq %rdi               # Przywrocenie wartosci rejestru rdi
60
+movq $2, %rcx           # Mnozenie 2. wyrazu przez 2
61
+mulq %rcx
62
+
63
+sub %rax, %rbx          # Obliczenie roznicy
64
+
65
+# Zwrocenie wyniku obliczen (przez rejestr rax, zgodnie z konwencja) i wyjscie
66
+mov %rbx, %rax
67
+jmp fun_end
68
+
69
+# Zwrocenie wynikow dla poczatkowych wyrazow (przez rejestr rax)
70
+x0:
71
+mov $2, %rax
72
+jmp fun_end
73
+
74
+x1:
75
+mov $1, %rax
76
+jmp fun_end
77
+
78
+x2:
79
+mov $3, %rax
80
+
81
+fun_end:
82
+pop %rbx                # Przywrocenie wartosci rejestru rbx
83
+pop %rbp                # Wyjscie z funkcji
84
+ret
85
+
86
+main:
87
+movq $number, %rdi      # Przekazanie parametru przez rejestr rdi
88
+call fun                # Wywolanie funkcji rekurencyjnej
89
+movq %rax, num          # Zapisanie w pamieci wyniku zwroconego przez rax
90
+
91
+# Wypisanie wyniku
92
+mov $SYSWRITE, %rax
93
+mov $STDOUT, %rdi
94
+mov $num, %rsi
95
+mov $n_size, %rdx
96
+syscall
97
+
98
+# Koniec programu
99
+mov $SYSEXIT, %rax
100
+mov $0, %rdi
101
+syscall

+ 101
- 0
lab3/rekurencja-stack.s Datei anzeigen

@@ -0,0 +1,101 @@
1
+# Jan Potocki 2019
2
+
3
+# Definicje numerow funkcji systemowych i ich parametrow
4
+SYSEXIT = 60
5
+SYSREAD = 0
6
+SYSWRITE = 1
7
+STDIN = 0
8
+STDOUT = 1
9
+STDERR = 2
10
+
11
+# Stale
12
+number = 5              # Wyraz ciagu (to mozna zmienic, reszty nie ruszac)
13
+
14
+n_size = 8              # Rozmiar bufora
15
+
16
+.bss
17
+num: .space n_size      # Bufor
18
+
19
+.text
20
+.globl main
21
+
22
+fun:
23
+# Funkcja obliczajaca wynik ciagu:
24
+# x_0=2
25
+# x_1=1
26
+# x_2=3
27
+# x_i=x_(i-2) - 2*x_(i-3)
28
+# 1 parametr - wyraz ciagu (64-bit int), przekazywany przez stos
29
+# Wynik zwracany przez stos
30
+
31
+pushq %rbp              # Wejscie do funkcji
32
+movq %rsp, %rbp
33
+pushq %rbx              # Zachowanie wartosci rejestru rbx, poniewaz bedzie
34
+                        # pozniej modyfikowany - a wg konwencji wywolan, rbx 
35
+                        # musi byc zachowany po stronie wywolanej funkcji
36
+
37
+cmpq $0, 16(%rbp)       # 16(%rbp) - 1. parametr przekazany na stosie
38
+je x0
39
+cmpq $1, 16(%rbp)
40
+je x1
41
+cmpq $2, 16(%rbp)
42
+je x2
43
+
44
+# Rekurencja
45
+# 1 wyraz
46
+movq 16(%rbp), %rax     # Obliczenie indeksu nowego wyrazu ciagu
47
+subq $2, %rax
48
+pushq %rax              # Przekazanie nowego wyrazu przez stos
49
+call fun                # 1. wywolanie rekurencyjne
50
+popq %rbx               # Zapisanie w rbx wyniku przekazanego przez stos
51
+
52
+# 2 wyraz
53
+movq 16(%rbp), %rax     # Obliczenie indeksu nowego wyrazu ciagu
54
+subq $3, %rax
55
+pushq %rax              # Przekazanie nowego wyrazu przez stos
56
+call fun                # 2. wywolanie rekurencyjne
57
+popq %rax               # Zapisanie w rax wyniku przekazanego przez stos
58
+movq $2, %rcx           # Mnozenie 2. wyrazu przez 2
59
+mulq %rcx
60
+
61
+subq %rax, %rbx         # Obliczenie roznicy
62
+
63
+# Zwrocenie wyniku obliczen (przez stos) i wyjscie
64
+movq %rbx, 16(%rbp)
65
+jmp fun_end
66
+
67
+# Zwrocenie wynikow dla poczatkowych wyrazow (przez stos)
68
+x0:
69
+movq $2, 16(%rbp)
70
+jmp fun_end
71
+
72
+x1:
73
+movq $1, 16(%rbp)
74
+jmp fun_end
75
+
76
+x2:
77
+movq $3, 16(%rbp)
78
+
79
+fun_end:
80
+popq %rbx               # Przywrocenie wartosci rejestru rbx
81
+popq %rbp               # Wyjscie z funkcji
82
+ret
83
+
84
+main:
85
+movq $number, %rax      # Przekazanie parametru...
86
+pushq %rax              # ...przez stos
87
+call fun                # Wywolanie funkcji rekurencyjnej
88
+popq %rax               # Zapisanie w rax wyniku zwroconego przez stos
89
+movq %rax, num          # Zapisanie wyniku w pamieci
90
+
91
+# Wypisanie wyniku
92
+movq $SYSWRITE, %rax
93
+movq $STDOUT, %rdi
94
+movq $num, %rsi
95
+movq $n_size, %rdx
96
+syscall
97
+
98
+# Koniec programu
99
+movq $SYSEXIT, %rax
100
+movq $0, %rdi
101
+syscall

+ 7
- 0
lab4/Makefile Datei anzeigen

@@ -0,0 +1,7 @@
1
+asm-printf-scanf: asm-printf-scanf.s kwadrat.c
2
+	gcc -g asm-printf-scanf.s kwadrat.c -o asm-printf-scanf -no-pie
3
+
4
+all: asm-printf-scanf
5
+
6
+clean:
7
+	rm -f asm-printf-scanf

+ 72
- 0
lab4/asm-printf-scanf.s Datei anzeigen

@@ -0,0 +1,72 @@
1
+# Jan Potocki 2019
2
+
3
+.data
4
+# Definicje numerow funkcji systemowych i ich parametrow
5
+SYSEXIT = 60
6
+SYSREAD = 0
7
+SYSWRITE = 1
8
+STDIN = 0
9
+STDOUT = 1
10
+STDERR = 2
11
+
12
+# Stale
13
+liczba = 130            # Liczba calkowita do wypisania przez printf
14
+
15
+# Ciagi formatujace dla scanf
16
+int1: .asciz "%ld"      # 64-bit int
17
+double1: .asciz "%lf"   # 64-bit double
18
+
19
+# Ciagi formatujace dla printf
20
+int2: .asciz "%ld\n"    # 64-bit int
21
+double2: .asciz "%f\n"  # 64-bit double (w printf nie "%lf"!)
22
+
23
+.bss
24
+# Zmienne
25
+x: .space 8             # 64-bit int
26
+y: .space 8             # 64-bit double
27
+wynik: .space 8         # 64-bit double
28
+
29
+.text
30
+.globl main
31
+
32
+main:
33
+pushq %rbp              # Wyrownanie stosu (alignment) - wymagane przez
34
+                        # konwencje wywolan
35
+
36
+# Wczytanie danych
37
+movb $0, %al            # Brak parametrow w rejestrach wektorowych
38
+movq $int1, %rdi        # Ciag formatujacy
39
+movq $x, %rsi           # Wskaznik na x
40
+call scanf
41
+
42
+movb $0, %al            # Brak parametrow w rejestrach wektorowych
43
+movq $double1, %rdi     # Ciag formatujacy
44
+movq $y, %rsi           # Wskaznik na y
45
+call scanf
46
+
47
+# Wywolanie funkcji w C
48
+movq (x), %rdi          # Przekazanie x (1. parametr, int) przez wartosc
49
+movq (y), %xmm0         # Przekazanie y (2. parametr, double) przez wartosc
50
+# Liczby rejestrow wektorowych w al nie ustawiamy, bo nasza funkcja przyjmuje
51
+# stala liczbe parametrow (inaczej niz printf czy scanf)
52
+call kwadrat
53
+# Wynik zostanie zwrocony w rejestrze xmm0, ktorym rowniez przekazuje sie go do
54
+# funkcji printf - wiec nic nie trzeba z nim robic
55
+
56
+# Wypisanie wyniku
57
+movb $1, %al            # 1 parametr w rejestrze wektorowym (xmm0)
58
+movq $double2, %rdi     # Ciag formatujacy
59
+call printf
60
+
61
+# Wypisanie liczby calkowitej ustawionej w stalej
62
+movb $0, %al            # Brak parametrow w rejestrach wektorowych
63
+movq $int2, %rdi        # Ciag formatujacy
64
+movq $liczba, %rsi      # Przekazanie stalej przez wartosc
65
+call printf
66
+
67
+popq %rbp               # Przywrocenie stosu do poprzedniego stanu
68
+
69
+# Koniec programu
70
+movq $SYSEXIT, %rax
71
+movq $0, %rdi
72
+syscall

+ 6
- 0
lab4/kwadrat.c Datei anzeigen

@@ -0,0 +1,6 @@
1
+double kwadrat(int x, double y)
2
+{
3
+    double z = x*x + y*y;
4
+
5
+    return z;
6
+}

+ 8
- 0
lab5/Makefile Datei anzeigen

@@ -0,0 +1,8 @@
1
+fpu: fpu.c arctg.s
2
+	gcc -g fpu.c arctg.s -o fpu -no-pie -lm
3
+
4
+
5
+all: fpu
6
+
7
+clean:
8
+	rm -f fpu

+ 62
- 0
lab5/arctg.s Datei anzeigen

@@ -0,0 +1,62 @@
1
+# Jan Potocki 2019
2
+# Szereg Taylora arctg(x) dla |x| < 1
3
+# y = (-1)^n * (x^(2n + 1)) / (2n + 1)
4
+
5
+.globl arctg
6
+.type arctg, @function
7
+
8
+arctg:
9
+pushq %rbp              # Wejscie do funkcji
10
+movq %rsp, %rbp
11
+subq $8, %rsp           # 64-bit double - tymczasowe miejsce w pamieci na x
12
+subq $4, %rsp           # 32-bit int - tymczasowe miejsce w pamieci na 2n+1
13
+
14
+# Przygotowanie danych
15
+vmovsd %xmm0, -8(%rbp)  # Umieszczenie w pamieci argumentu funkcji
16
+movq $0, %r8            # r8 - indeks sumy (n), na razie wyzerowany...
17
+fldz                    # Umieszczenie 0 na stosie FPU (do sumowania szeregu)
18
+
19
+szereg:
20
+# Glowna petla
21
+incq %r8                # ...trzeba zliczac od 1, indeks jest argumentem ciagu
22
+
23
+# Obliczenie 2n+1
24
+movq $2, %rax
25
+mulq %r8
26
+incq %rax
27
+movl %eax, -12(%rbp)    # Zapisanie wyniku 2n+1 w pamieci
28
+
29
+# Potegowanie (iteracyjne)
30
+fldl -8(%rbp)           # Umieszczenie na stosie FPU poczatkowej wartosci
31
+movq $1, %r9            # r9 - zliczanie wykladnika (zaczynamy od 1. potegi)
32
+
33
+potega:
34
+fmull -8(%rbp)          # Mnozenie st(0) przez podstawe potegi (w pamieci)
35
+incq %r9                # Aktualizacja wykladnika
36
+cmpq %r9, %rax          # Sprawdzenie czy wykladnik 2n+1 zostal osiagniety
37
+jne potega
38
+
39
+# Dzielenie
40
+fidivl -12(%rbp)
41
+
42
+# Sprawdzenie parzystosci wykladnika w (-1)^n
43
+movq $0, %rdx           # rdx - starsza polowka bitow dzielnej
44
+movq %r8, %rax          # rax - mlodsza polowka bitow dzielnej
45
+movq $2, %rcx           # rcx - dzielnik
46
+divq %rcx
47
+cmpq $1, %rdx           # rdx - reszta z dzielenia
48
+jne suma                # Reszta 0 -> wykladnik parzysty, jest OK
49
+fchs                    # Reszta 1 -> wykladnik nieparzysty, potrzebny minus
50
+
51
+suma:
52
+faddp                   # st(1) - poprzednia iteracja, st(0) - aktualna
53
+
54
+cmpq %r8, %rdi          # Sprawdzenie czy wyraz szeregu zostal osiagniety
55
+jne szereg
56
+
57
+fstl -8(%rbp)           # Zapisanie wyniku w pamieci...
58
+movsd -8(%rbp), %xmm0   # i zwrocenie w xmm0 (bezposrednio sie nie da)
59
+
60
+addq $12, %rsp          # Zwolnienie zmiennych lokalnych
61
+popq %rbp               # Wyjscie z funkcji
62
+ret

+ 26
- 0
lab5/arctgc.c Datei anzeigen

@@ -0,0 +1,26 @@
1
+// Jan Potocki 2019
2
+
3
+#include <math.h>
4
+
5
+double arctgc(double x, int kroki)
6
+{
7
+    int wyraz, i;
8
+    double potega, wynik;
9
+    double suma = 0;
10
+    
11
+    for(i = 1; i <= kroki; i++)
12
+    {
13
+        wyraz = 2*i + 1;
14
+        potega = pow(x, (double)wyraz);
15
+        wynik = potega/(double)wyraz;
16
+
17
+        if(i % 2 == 1)
18
+        {
19
+            wynik = -wynik;
20
+        }
21
+
22
+        suma += wynik;
23
+    }
24
+
25
+    return suma;
26
+}

+ 25
- 0
lab5/fpu.c Datei anzeigen

@@ -0,0 +1,25 @@
1
+// Jan Potocki 2019
2
+
3
+#include <stdio.h>
4
+#include <math.h>
5
+#include "arctgc.c"
6
+
7
+double arctg(double x, int kroki);
8
+
9
+const double x = 0.5;
10
+const int n = 100;
11
+
12
+int main()
13
+{
14
+    double wynik_asm, wynik_c;
15
+
16
+    printf("Szereg Taylora arctg(%f) dla n=%d...\n", x, n);
17
+    
18
+    wynik_asm = arctg(x, n);
19
+    wynik_c = arctgc(x, n);
20
+
21
+    printf("Wynik asm:\t%f\n", wynik_asm);
22
+    printf("Wynik C:\t%f\n", wynik_c);
23
+    
24
+    return 0;
25
+}

Laden…
Abbrechen
Speichern