浏览代码

Wydanie R2020.05.1

Jan Potocki 5 年前
父节点
当前提交
0ba84bef75
共有 11 个文件被更改,包括 339 次插入0 次删除
  1. 13
    0
      fibb_tsc/Makefile
  2. 43
    0
      fibb_tsc/fibb32.s
  3. 40
    0
      fibb_tsc/fibb64.s
  4. 21
    0
      fibb_tsc/fibb_c.c
  5. 20
    0
      fibb_tsc/second.c
  6. 13
    0
      fibb_tsc/timestamp32.s
  7. 16
    0
      fibb_tsc/timestamp64.s
  8. 7
    0
      lab2-v3/Makefile
  9. 17
    0
      lab2-v3/README.md
  10. 149
    0
      lab2-v3/mul.s
  11. 二进制
      lab2-v3/mul.tar.bz2

+ 13
- 0
fibb_tsc/Makefile 查看文件

@@ -0,0 +1,13 @@
1
+all: fibb_32 fibb_64 second
2
+
3
+fibb_32: fibb_c.c fibb32.s timestamp32.s
4
+	gcc -m32 fibb32.s timestamp32.s fibb_c.c -o fibb_32
5
+
6
+fibb_64: fibb_c.c fibb64.s timestamp64.s
7
+	gcc -no-pie fibb64.s timestamp64.s fibb_c.c -o fibb_64
8
+
9
+second: second.c timestamp32.s
10
+	gcc -m32 timestamp32.s second.c -o second
11
+
12
+clean:
13
+	rm fibb_32 fibb_64 second

+ 43
- 0
fibb_tsc/fibb32.s 查看文件

@@ -0,0 +1,43 @@
1
+# Jan Potocki 2020
2
+
3
+.global fibb
4
+
5
+# Segment kodu
6
+.text
7
+
8
+fibb:
9
+push %ebp
10
+mov %esp, %ebp
11
+push %ebx
12
+
13
+cmpl $0, 8(%ebp)
14
+je zero
15
+
16
+cmpl $1, 8(%ebp)
17
+je jeden
18
+
19
+movl 8(%ebp), %edx
20
+dec %edx
21
+push %edx
22
+call fibb
23
+pop %edx
24
+mov %eax, %ebx
25
+
26
+dec %edx
27
+push %edx
28
+call fibb
29
+add $4, %esp
30
+add %ebx, %eax
31
+jmp wyjscie
32
+
33
+zero:
34
+mov $0, %eax
35
+jmp wyjscie
36
+
37
+jeden:
38
+mov $1, %eax
39
+
40
+wyjscie:
41
+pop %ebx
42
+pop %ebp
43
+ret

+ 40
- 0
fibb_tsc/fibb64.s 查看文件

@@ -0,0 +1,40 @@
1
+# Jan Potocki 2020
2
+
3
+.global fibb
4
+
5
+# Segment kodu
6
+.text
7
+
8
+fibb:
9
+push %rbp
10
+mov %rsp, %rbp
11
+push %rbx
12
+
13
+cmp $0, %rdi
14
+je zero
15
+
16
+cmp $1, %rdi
17
+je jeden
18
+
19
+dec %rdi
20
+push %rdi
21
+call fibb
22
+pop %rdi
23
+mov %rax, %rbx
24
+
25
+dec %rdi
26
+call fibb
27
+add %rbx, %rax
28
+jmp wyjscie
29
+
30
+zero:
31
+mov $0, %rax
32
+jmp wyjscie
33
+
34
+jeden:
35
+mov $1, %rax
36
+
37
+wyjscie:
38
+pop %rbx
39
+pop %rbp
40
+ret

+ 21
- 0
fibb_tsc/fibb_c.c 查看文件

@@ -0,0 +1,21 @@
1
+#include <stdio.h>
2
+
3
+unsigned long fibb(unsigned long n);
4
+unsigned long long timestamp();
5
+
6
+int main()
7
+{
8
+    unsigned long term, result;
9
+    unsigned long long tstamp1, tstamp2;
10
+    
11
+    scanf("%lu", &term);
12
+    
13
+    tstamp1 = timestamp();
14
+    result = fibb(term);
15
+    tstamp2 = timestamp();
16
+    
17
+    printf("%lu\n", result);
18
+    printf("Cycles: %llu\n", tstamp2-tstamp1);
19
+    
20
+    return 0;
21
+}

+ 20
- 0
fibb_tsc/second.c 查看文件

@@ -0,0 +1,20 @@
1
+#include <stdio.h>
2
+#include <unistd.h>
3
+
4
+// Jan Potocki 2020
5
+
6
+unsigned long long timestamp();
7
+
8
+
9
+int main()
10
+{
11
+    unsigned long long tstamp1, tstamp2;
12
+    
13
+    tstamp1 = timestamp();
14
+    sleep(1);
15
+    tstamp2 = timestamp();
16
+    
17
+    printf("Cycles: %llu\n", tstamp2 - tstamp1);
18
+    
19
+    return 0;
20
+}

+ 13
- 0
fibb_tsc/timestamp32.s 查看文件

@@ -0,0 +1,13 @@
1
+# Jan Potocki 2020
2
+
3
+.global timestamp
4
+
5
+# Segment kodu
6
+.text
7
+
8
+timestamp:
9
+xor %eax, %eax
10
+cpuid
11
+rdtsc
12
+
13
+ret

+ 16
- 0
fibb_tsc/timestamp64.s 查看文件

@@ -0,0 +1,16 @@
1
+# Jan Potocki 2020
2
+
3
+.global timestamp
4
+
5
+# Segment kodu
6
+.text
7
+
8
+timestamp:
9
+xor %rax, %rax
10
+cpuid
11
+rdtsc
12
+
13
+shl $32, %rdx
14
+or %rdx, %rax
15
+
16
+ret

+ 7
- 0
lab2-v3/Makefile 查看文件

@@ -0,0 +1,7 @@
1
+all: mul
2
+
3
+mul: mul.s
4
+	gcc mul.s -o mul
5
+
6
+clean:
7
+	rm mul

+ 17
- 0
lab2-v3/README.md 查看文件

@@ -0,0 +1,17 @@
1
+Należy napisać program, który:
2
+* Ze standardowego strumienia wejściowego odczyta (za pomocą funkcji systemowej _read_) bloki zawierające 512 bajtów każdy. Liczba bloków może być dowolna. Kombinacje bitów w bajtach mogą być dowolne.
3
+* Każdy blok potraktowany zostanie jako zapisane po sobie dwie reprezentacje w kodzie naturalnym binarnym. Pierwszy odczytany bajt w bloku zawiera najmniej znaczący bit reprezentacji. Każda z reprezentacji zajmuje ciągłą połowę odczytanego bloku, czyli układ danych w bloku można opisać jako:  
4
+`A0 A1 A2 ... A255 B0 B1 B2 ... B255`
5
+gdzie `Ai` i `Bi` oznaczają kolejne bajty (o indeksach _i_) reprezentacji pierwszej (_A_) i drugiej (_B_).
6
+* Po odczytaniu bloku danych, na standardowe wyjście zostanie wypisana reprezentacja iloczynu liczb zapisanych reprezentacjami A i B. Format reprezentacji wyjściowej będzie taki sam, jak wejściowych, ale o odpowiednio dopasowanej wielkości.
7
+
8
+
9
+Przykładowe dane wejściowe i oczekiwane wyniki są dostępne pod adresem http://zak.iiar.pwr.wroc.pl/materials/architektura/laboratorium%20AK2/Dane/mul.tar.bz2  
10
+Pliki z rozszerzeniem `.in` to dane wejściowe, pliki `*.out` to oczekiwane odpowiedzi.  
11
+Docelowo program ma działać dla danych z plików `mul_256.*`, ale dla ułatwienia Państwu pracy na początku realizacji zadania przygotowałem także pliki z reprezentacjami 4-bajtowymi (pliki `mul_4.*`).
12
+
13
+Podczas implementacji największe problemy może Państwu sprawić poprawna realizacja algorytmu mnożenia.  
14
+Przykładowe koncepcje należy sobie przypomnieć z materiałów z poprzedniego semestru, np. slajdy 38 i 39 pliku http://zak.iiar.pwr.wroc.pl/materials/Arytmetyka%20komputerow/architekura.pdf i podstawy z pliku http://zak.iiar.pwr.wroc.pl/materials/Arytmetyka%20komputerow/mnozenie.pdf  
15
+Oczywiście zadanie to można zrealizować na wiele sposobów, zmieniając zarówno rozmiar pojedynczych iloczynów częściowych, jak i kolejność ich kumulacji.  
16
+Można np. kumulację iloczynów częściowych przeprowadzać "wierszami", dodając poszczególne iloczyny częściowe "w poziomie", można także kumulować "kolumnami" sumując iloczyny "w pionie". Można także stosować różne rozwiązania pośrednie.  
17
+Niezależnie jednak od przyjętego sposobu, koniecznie proszę pamiętać o właściwej propagacji przeniesień.

+ 149
- 0
lab2-v3/mul.s 查看文件

@@ -0,0 +1,149 @@
1
+# Jan Potocki 2020
2
+
3
+# Definicje numerow funkcji systemowych i ich parametrow
4
+SYSEXIT64 = 60
5
+SYSREAD = 0
6
+SYSWRITE = 1
7
+STDIN = 0
8
+STDOUT = 1
9
+
10
+# Stale okreslajace rozmiar przetwarzanych danych
11
+num_length = 256
12
+# ...tego nie ruszac - inaczej stanie sie "cud nad klawiatura" :-D
13
+word_length = 8
14
+buf_length = num_length * 2
15
+num_words = num_length / word_length
16
+buf_words = buf_length / word_length
17
+
18
+.global main
19
+
20
+# Segment niezainicjalizowanych danych
21
+.bss
22
+
23
+liczba1: .space num_length
24
+liczba2: .space num_length
25
+wynik: .space buf_length
26
+
27
+# Segment kodu
28
+.text
29
+
30
+main:
31
+# Glowna petla
32
+petla:
33
+mov $SYSREAD, %rax          # Wczytanie danych ze standardowego wejscia
34
+mov $STDIN, %rdi            # ...funkcja systemowa read
35
+mov $liczba1, %rsi
36
+mov $buf_length, %rdx
37
+syscall
38
+
39
+# UWAGA
40
+# Tutaj wczytane zostana od razu obie liczby
41
+# liczba1 i liczba2 sa w pamieci bezposrednio po sobie...
42
+# ...i zostala przekazana do funkcji read dlugosc calego bloku
43
+
44
+cmp $buf_length, %rax       # rax - liczba wczytanych bajtow
45
+jl koniec                   # Jezeli nie ma 512, to dane sie skonczyly
46
+
47
+xor %rsi, %rsi              # rsi - licznik petli zerujacej
48
+
49
+# Petla zerujaca bufor na wynik
50
+wyzeruj:
51
+movq $0, wynik(, %rsi, 8)
52
+inc %rsi
53
+cmp $buf_words, %rsi
54
+jl wyzeruj
55
+
56
+xor %rsi, %rsi              # rsi - licznik pierwszej petli
57
+
58
+# Mnozenie - petla zewnetrzna
59
+petla1:
60
+xor %rcx, %rcx              # rcx - miejsce na starsza czesc wyniku
61
+
62
+# Flagi przeniesienia (potrzebne sa dwie i tego sie nie uprosci)
63
+mov $0, %r8                 # r8 - dla koncowego wyniku (w pamieci)
64
+clc                         # RFLAGS - dla biezacego mnozenia (rejestry)
65
+pushf                       # ...oczywiscie z backupem na stosie
66
+
67
+xor %rdi, %rdi              # rdi - licznik drugiej petli
68
+
69
+# Mnozenie - petla wewnetrzna
70
+petla2:
71
+movq liczba1(, %rsi, 8), %rax
72
+mulq liczba2(, %rdi, 8)
73
+
74
+mov %rdi, %r9               # r9 - indeks wyniku
75
+add %rsi, %r9               # (suma indeksow obu petli)
76
+
77
+# Dodanie starszej czesci wyniku z poprzedniej iteracji
78
+popf                        # Tutaj flagi mamy na stosie...
79
+adc %rcx, %rax
80
+pushf                       # ...wiec to jest proste
81
+
82
+# Przygotowanie flagi przeniesienia do sumowania wyniku (patent cz. I)
83
+cmp $1, %r8                 # Tego nie mamy na stosie...
84
+je ustaw_cf1                # ...wiec musimy sprytnym sposobem ;-)
85
+
86
+clc                         # Przypadek bez przeniesienia
87
+jmp dodaj_wynik
88
+
89
+ustaw_cf1:
90
+stc                         # Przypadek z przeniesieniem
91
+
92
+# Dodawanie biezacego wyniku do pamieci
93
+# (tam po wszystkich iteracjach bedzie wynik koncowy)
94
+dodaj_wynik:
95
+adcq %rax, wynik(, %r9, 8)
96
+
97
+# Zapisanie flagi przeniesienia do sumowania wyniku (patent cz. II)
98
+jc zapisz_cf
99
+
100
+mov $0, %r8                 # Jezeli przeniesienia nie bylo
101
+jmp dalej
102
+
103
+zapisz_cf:
104
+mov $1, %r8                 # Jezeli przeniesienie bylo
105
+
106
+dalej:
107
+mov %rdx, %rcx              # Przechowanie starszej czesci wyniku w rcx
108
+
109
+inc %rdi
110
+cmp $num_words, %rdi
111
+jl petla2                   # Koniec wewnetrznej petli
112
+
113
+# Tutaj musimy sie jeszcze zajac najstarsza czescia wyniku
114
+# (z ostatniej iteracji petli wewnetrznej)
115
+inc %r9
116
+
117
+popf                        # Dodanie przeniesienia z sumowania rejestrow
118
+adc $0, %rcx                # ...jezeli jakies zostalo
119
+
120
+# Przygotowanie flagi przeniesienia do sumowania wyniku (patent cz. I)
121
+cmp $1, %r8
122
+je ustaw_cf2
123
+
124
+clc                         # Przypadek bez przeniesienia
125
+jmp dodaj_najstarsze
126
+
127
+ustaw_cf2:
128
+stc                         # Przypadek z przeniesieniem
129
+
130
+dodaj_najstarsze:
131
+adcq %rcx, wynik(, %r9, 8)
132
+
133
+inc %rsi
134
+cmp $num_words, %rsi
135
+jl petla1                   # Koniec zewnetrznej petli
136
+
137
+mov $SYSWRITE, %rax			# Wypisanie wyniku na standardowe wyjscie
138
+mov $STDOUT, %rdi			# ...funkcja systemowa write
139
+mov $wynik, %rsi
140
+mov $buf_length, %rdx
141
+syscall
142
+
143
+jmp petla					# Koniec glownej petli
144
+
145
+# Wyjscie z programu
146
+koniec:
147
+mov $SYSEXIT64, %rax        # Funkcja systemowa exit...
148
+mov $0, %rdi                # ...kod zakonczenia - 0
149
+syscall

二进制
lab2-v3/mul.tar.bz2 查看文件


正在加载...
取消
保存