View difference between Paste ID: YTRYJP6d and CBREc1tR
SHOW: | | - or go back to the newest paste.
1
.type decrl @function
2
decrl:
3
	pushq	%rbp
4
	movq	%rsp, %rbp
5
	movq	16(%rbp), %rsi
6
	movq	24(%rbp), %rcx
7
	movq	$-1, %rdi
8
	stc
9
start:
10
	incq	%rdi
11
	sbbq	$0, (%rsi, %rdi, 8)
12
	jc	start
13
	movq	%rbp, %rsp
14
	popq	%rbp
15
	ret
16
17
18
.type sqrint @function
19
sqrint:
20
	push	%rbp
21
	mov	%rsp, %rbp
22-
	movq	%rdi, %rax			# Tylko na potrzeby testowania (parametr w rdi)
22+
	andq	%rax, %rax		# Sprawdzamy czy rax = 0
23
	jz	endf				# Jeśli tak do kończymy zwracając 0
24-
	andq	%rax, %rax			# Sprawdzamy czy rax = 0
24+
	movq	%rax, %rdx		# Parametr n do rdx
25
	movq	$0, %rax		# Licznik / wynik
26-
	movq	%rax, %rdx			# Parametr n do rdx
26+
	movq	$1, %rbx		# Aktualna liczba nieparzysta
27-
	movq	$0, %rax			# Licznik / wynik
27+
28-
	movq	$1, %rbx			# Aktualna liczba nieparzysta
28+
	subq	%rbx, %rdx		# Odejmujemy aktualną nieparzystą
29
	jb	endf				# Jeśli wynik mniejszy od 0 to kończymy
30-
	subq	%rbx, %rdx			# Odejmujemy aktualną nieparzystą
30+
	incq	%rax			# Inkremementacja licznika
31
	addq	$2, %rbx		# Kolejna liczba nieparzysta
32-
	incq	%rax				# Inkremementacja licznika
32+
33-
	addq	$2, %rbx			# Kolejna liczba nieparzysta
33+
34
	mov	%rbp, %rsp
35
	pop	%rbp
36
	ret
37
38
39
.type fibonac @function
40
fibonac:
41
	pushq	%rbp
42
	movq	%rsp, %rbp
43
	movq	16(%rbp), %rcx
44
	movq	$0, %rbx			# F(0)
45-
	
45+
46
	decq	%rcx				# Dekrementacja rcx
47
	jz	endf					# Jeśli rcx = 0 to zwróć 1
48
	jns	start					# Jeśli rcx > 0 to skocz do pętli
49-
	jz	endf				# Jeśli rcx = 0 to zwróć 1
49+
50-
	jns	start				# Jeśli rcx > 0 to skocz do pętli
50+
	jmp	endf					# I skocz na koniec
51
start:
52-
	jmp	endf				# I skocz na koniec
52+
53
	xchgq	%rax, %rbx			# F(n - 1) <-> F(n)
54
	loop	start				# Pętla
55
endf:
56
	movq	%rax, 16(%rbp)		# Umieszczenie wyniku na stosie
57
	movq	%rbp, %rsp
58-
	movq	%rax, 16(%rbp)			# Umieszczenie wyniku na stosie
58+
59
	ret
60
61
62
.type inverseb @function
63
inverseb:
64
	push	%rbp
65
	movq	%rsp, %rbp
66
	movq	16(%rbp), %rbx			# Adres liczby
67
	movq	24(%rbp), %rcx			# Parametr N
68
69
	movb	(%rbx), %al				# Kopia najbardziej znaczącego bajtu liczby w al
70-
	movb	(%rbx), %al			# Kopia najbardziej znaczącego bajtu liczby w al
70+
	andb	%al, %al				# Test
71-
	andb	%al, %al			# Test
71+
	jns	endf						# Jeśli SF = 0 (liczba dodatnia) to skocz na koniec
72-
	jns	endf				# Jeśli SF = 0 (liczba dodatnia) to skocz na koniec
72+
	stc								# Ustaw CF = 1
73-
	stc					# Ustaw CF = 1
73+
74
	notq	-8(%rbx, %rcx, 8)		# (%rbx, %rcx, 8) wskazuje na przestrzeń ZA liczbą, 
75
									# dlatego cofamy się o 8 bajtów do 8 najmniej znaczących bajtów liczby
76-
						# dlatego cofamy się o 8 bajtów do 8 najmniej znaczących bajtów liczby
76+
	adcq	$0, -8(%rbx, %rcx, 8)	# Dodajemy 1 / przeniesienie
77-
	adcq	$0, -8(%rbx, %rcx, 8)		# Dodajemy 1 / przeniesienie
77+
	loop	negate					# Zapętlamy według rcx
78-
	loop	negate				# Zapętlamy według rcx
78+
79
endf:
80
	movq	%rbp, %rsp
81
	popq	%rbp
82
	ret
83
84
85
.type inversel @function
86
inversel:
87
	push	%rbp
88
	movq	%rsp, %rbp
89
	movq	16(%rbp), %rbx			# Adres liczby
90
	movq	24(%rbp), %rcx			# Parametr N
91
92
	movq	-8(%rbx, %rcx, 8), %rax		# Kopia najbardziej znaczącej części liczby
93-
	andq	%rax, %rax			# Test
93+
	andq	%rax, %rax				# Test
94-
	jns	endf				# Jeśli SF = 0 (liczba dodatnia) to skocz na koniec
94+
	jns	endf						# Jeśli SF = 0 (liczba dodatnia) to skocz na koniec
95-
	movq	$0, %rdx			# Licznik
95+
	movq	$0, %rdx				# Licznik
96-
	stc					# Ustaw CF = 1
96+
	stc								# Ustaw CF = 1
97
negate:
98
	notq	(%rbx, %rdx, 8)			# Negujemy nastepne 64 bity 
99
	adcq	$0, (%rbx, %rdx, 8)		# Dodajemy 1 / przeniesienie
100
	incq	%rdx
101-
	loop	negate				# Zapętlamy według rcx
101+
	loop	negate					# Zapętlamy według rcx
102
endf:
103
	movq	%rbp, %rsp
104
	popq	%rbp
105
	ret
106
107
108
.type gcd @function
109
gcd:
110
	pushq	%rbp
111
	movq	%rsp, %rbp
112
	movq	16(%rbp), %rax			# Liczba a
113
	movq	24(%rbp), %rbx			# Liczba b
114
start:
115
	andq	%rbx, %rbx			# Sprawadzmy czy b = 0
116-
	jz	endf				# Jeśli tak to skok na koniec
116+
	jz	endf					# Jeśli tak to skok na koniec
117
	movq	$0, %rdx			# 0 do rdx do dzielenia
118
	divq	%rbx				# Dzielimy rax / rbx
119
	movq	%rdx, %rax			# Reszta do rax
120
	xchgq	%rax, %rbx			# Wymiana rax <-> rbx
121-
	jmp	start				# Pętla
121+
	jmp	start					# Pętla
122
endf:
123
	movq	%rbp, %rsp
124
	popq	%rbp
125
	ret
126
127
128
OFFSET = 'z' - 'a' + 1
129
.type cezar @function
130
cezar:
131
	pushq	%rbp
132
	movq	%rsp, %rbp
133
	movq	16(%rbp), %rsi			# Adres ciągu
134
	movq	24(%rbp), %rdx			# Klucz
135
	subq	$'a', %rdx				# Klucz -> liczba
136
	movq	$-1, %rcx				# Licznik na -1
137-
	subq	$'a', %rdx			# Klucz -> liczba
137+
138-
	movq	$-1, %rcx			# Licznik na -1
138+
	incq	%rcx					# Inkrementacja licznika
139
	movb	(%rsi, %rcx, 1), %bl	# Kolejny znak
140-
	incq	%rcx				# Inkrementacja licznika
140+
	cmpb	$'\n', %bl				# Jeśli znak nowej linii
141-
	movb	(%rsi, %rcx, 1), %bl		# Kolejny znak
141+
	je	endf						# To zakończ
142-
	cmpb	$'\n', %bl			# Jeśli znak nowej linii
142+
	cmpb	$' ', %bl				# Jeśli spacja
143-
	je	endf				# To zakończ
143+
	je	start						# To skocz do kolejnej iteracji
144-
	cmpb	$' ', %bl			# Jeśli spacja
144+
	orb	$0x20, %bl					# Wymuś małe litery
145-
	je	start				# To skocz do kolejnej iteracji
145+
	addq	%rdx, %rbx				# Dodaj klucz do znaku
146-
	orb	$0x20, %bl			# Wymuś małe litery
146+
	cmpq	$'z', %rbx				# Jeśli otzrymany znak mieści się w zakresie
147-
	addq	%rdx, %rbx			# Dodaj klucz do znaku
147+
	jle	save						# Skocz do końca iteracji
148-
	cmpq	$'z', %rbx			# Jeśli otzrymany znak mieści się w zakresie
148+
149-
	jle	save				# Skocz do końca iteracji
149+
150
	movb	%bl, (%rsi, %rcx, 1)	# Wpisz zaszyfrowany znak do pamięci
151
	jmp	start						# Zapętl
152-
	movb	%bl, (%rsi, %rcx, 1)		# Wpisz zaszyfrowany znak do pamięci
152+
153-
	jmp	start				# Zapętl
153+
154-
	
154+
155
	ret
156
157
158
.type atoix @function
159
atoix:
160
	pushq	%rbp
161
	movq	%rsp, %rbp
162
	movq	16(%rbp), %rsi
163
	movq	24(%rbp), %rcx
164-
	#movq	16(%rbp), %rsi
164+
165-
	#movq	24(%rbp), %rcx
165+
166-
	movq	%rsi, %rcx
166+
167-
	movq	%rdi, %rsi
167+
168-
	
168+
169
	mulq	%rdi				# Mnożenie rax * 10
170
	addq	%rbx, %rax			# Dodanie cyfry do rax
171
	incq	%rsi				# Przesunięcie adresu na kolejny bajt
172
	loop	start				# Pętla
173
	movq	%rbp, %rsp
174
	popq	%rbp
175
	ret
176
177
178
.type max2 @function
179
max2:
180
	pushq	%rbp
181
	movq	%rsp, %rbp
182
	movq	16(%rbp), %rsi
183
	movq	24(%rbp), %rcx
184
	decq	%rcx				# Wykonujemy n - 1 porównań
185
	movq	%rsi, %rax			# Adres największej liczby (na początku przyjmujemy pierwszą)
186
	movq	8(%rsi), %rdx		# Wyższa część aktualnie największe liczby
187
	movq	(%rsi), %rbx		# Niższa część aktualnie największej liczby
188
start:
189
	addq	$16, %rsi			# Przesuwamy wskaźnik na następną liczbę
190-
	decq	%rcx			# Wykonujemy n - 1 porównań
190+
191-
	movq	%rsi, %rax		# Adres największej liczby (na początku przyjmujemy pierwszą)
191+
	jl	bigger					# Jeśli większa to skok
192
	je	equal					# Jeśli równa to porównaj niższą część
193
	jmp	repeat					# Jeśli mniejsza to następna liczba
194
equal:
195-
	addq	$16, %rsi		# Przesuwamy wskaźnik na następną liczbę
195+
196
	jl	bigger					# Jeśli większa to skok
197-
	jl	bigger			# Jeśli większa to skok
197+
	jmp	repeat					# Jeśli mniejsza bądź równa to następna liczba
198-
	je	equal			# Jeśli równa to porównaj niższą część
198+
199-
	jmp	repeat			# Jeśli mniejsza to następna liczba
199+
200
	movq	(%rsi), %rbx		# Zapisz niższą część aktualnej liczby jako największą
201
	movq	%rsi, %rax			# Zapisz adres aktualnej liczby
202-
	jl	bigger			# Jeśli większa to skok
202+
203-
	jmp	repeat			# Jeśli mniejsza bądź równa to następna liczba
203+
	loop	start				# Zapętl według rcx
204
	movq	%rax, %rbx			# wynik w rbx (polecenie)
205
	movq	%rbp, %rsp
206
	popq	%rbp
207-
	movq	%rsi, %rax		# Zapisz adres aktualnej liczby
207+