aboutsummaryrefslogtreecommitdiff
path: root/semestr-4/ask/lista5/puzzle4.s
diff options
context:
space:
mode:
authorFranciszek Malinka <franciszek.malinka@gmail.com>2021-10-05 21:49:54 +0200
committerFranciszek Malinka <franciszek.malinka@gmail.com>2021-10-05 21:49:54 +0200
commitc5fcf7179a83ef65c86c6a4a390029149e518649 (patch)
treed29ffc5b86a0d257453cedcf87d91a13d8bf3b0d /semestr-4/ask/lista5/puzzle4.s
parentf8a88b6a4aba1f66d04711a9330eaba49a50c463 (diff)
Duzy commit ze smieciami
Diffstat (limited to 'semestr-4/ask/lista5/puzzle4.s')
-rw-r--r--semestr-4/ask/lista5/puzzle4.s24
1 files changed, 24 insertions, 0 deletions
diff --git a/semestr-4/ask/lista5/puzzle4.s b/semestr-4/ask/lista5/puzzle4.s
new file mode 100644
index 0000000..16ca386
--- /dev/null
+++ b/semestr-4/ask/lista5/puzzle4.s
@@ -0,0 +1,24 @@
+.global puzzle4
+
+.text
+puzzle4: # argumenty: rdi - long*, rsi - long, rdx - uint64, rcx - uint64
+ movq %rcx, %rax # rax := rcx
+ subq %rdx, %rax # rax -= rdx
+ shrq %rax # rax >>= 1; // ale logiczne!
+ addq %rdx, %rax # rax += rdx;
+ cmpq %rdx, %rcx # if rcx < rdx
+ jb .L5 # then jump to L5
+ movq (%rdi,%rax,8), %r8 # r8 = *(rdi + 8*rax)
+ cmpq %rsi, %r8 # if rsi == r8
+ je .L10 # then jump to L10
+ cmpq %rsi, %r8 # if (r8 - rsi < 0) <=> r8 < rsi
+ jg .L11 # then jump to L11
+ leaq 1(%rax), %rdx # rdx := rax + 1
+ call puzzle4 # call recursively puzzle4
+.L10: ret # return rax
+.L11: leaq -1(%rax), %rcx # rcx := rax - 1
+ call puzzle4 # call recursively puzzle4
+ ret # return rax
+.L5: movl $-1, %eax # eax := -1
+ ret # return rax
+