aboutsummaryrefslogtreecommitdiffstats
path: root/06-Sum-Square-Difference
diff options
context:
space:
mode:
Diffstat (limited to '06-Sum-Square-Difference')
-rw-r--r--06-Sum-Square-Difference/asm/Makefile6
-rwxr-xr-x06-Sum-Square-Difference/asm/sumsqbin0 -> 17248 bytes
-rw-r--r--06-Sum-Square-Difference/asm/sumsq.asm49
-rw-r--r--06-Sum-Square-Difference/asm/sumsq.obin0 -> 2192 bytes
-rwxr-xr-x[-rw-r--r--]06-Sum-Square-Difference/sumsqbin16616 -> 16616 bytes
5 files changed, 55 insertions, 0 deletions
diff --git a/06-Sum-Square-Difference/asm/Makefile b/06-Sum-Square-Difference/asm/Makefile
new file mode 100644
index 0000000..68e7f4f
--- /dev/null
+++ b/06-Sum-Square-Difference/asm/Makefile
@@ -0,0 +1,6 @@
+sumsq: sumsq.o
+ gcc sumsq.o -o sumsq
+sumsq.o: sumsq.asm
+ nasm -w+all -f elf64 -g -F stabs sumsq.asm
+clean:
+ rm -f sumsq sumsq.o
diff --git a/06-Sum-Square-Difference/asm/sumsq b/06-Sum-Square-Difference/asm/sumsq
new file mode 100755
index 0000000..d282ab2
--- /dev/null
+++ b/06-Sum-Square-Difference/asm/sumsq
Binary files differ
diff --git a/06-Sum-Square-Difference/asm/sumsq.asm b/06-Sum-Square-Difference/asm/sumsq.asm
new file mode 100644
index 0000000..cc9295a
--- /dev/null
+++ b/06-Sum-Square-Difference/asm/sumsq.asm
@@ -0,0 +1,49 @@
+; Find the difference between (1+2+3+...+100)^2 and (1^2+2^2+3^2+...+100^2)
+; I used another math trick here:
+; The sum up to a number can be found using Gauss' Trick:
+; 1 + 2 + 3 + ... + 10 -> (1+9) + (2+8) + (3+7) + (4+6) + 10 + 5 -> 5*10 +5
+; In general : (n/2)(n+1)
+
+extern printf
+SECTION .data
+flag: db "%d",10,0 ; "%d\n\0"
+
+SECTION .text
+ global main
+ global is_divisible
+
+main:
+ push rbp ; set up stack
+ mov rbp, rsp
+
+ ; first square of sum (1+2+...100)^2
+ mov rax, 50 ; sum = n/2
+ mov rcx, 101 ; * (n + 1)
+ mul rcx
+ mul rax ; square it
+ push rax ; save it
+
+ ; now sum the squares (1^2+2^2 ...) no short cut this time
+ xor r11, r11 ; This will store the sum, rcx will b n,
+ ; rax is just used to multiply
+ mov rcx, 0 ; n = 0, we add one first
+
+.loop inc rcx ; see? told you :)
+ mov rax, rcx ; move into multiply register
+ mul rax ; multiply by itself
+ add r11, rax ; add to the sum
+ cmp rcx, 100
+ jne .loop
+
+ pop rax ; sum of the squares is on the stack
+ sub rax, r11 ; take the difference, rax - r11
+ ; square of the sum is bigger
+.print mov rdi, flag ; arg 1 (format)
+ mov rsi, rax ; arg 2 (value)
+ mov rax, 0 ; no xmm registers
+ call printf wrt ..plt
+ pop rbp
+
+ mov rax, 0
+ ret
+
diff --git a/06-Sum-Square-Difference/asm/sumsq.o b/06-Sum-Square-Difference/asm/sumsq.o
new file mode 100644
index 0000000..9b0a44b
--- /dev/null
+++ b/06-Sum-Square-Difference/asm/sumsq.o
Binary files differ
diff --git a/06-Sum-Square-Difference/sumsq b/06-Sum-Square-Difference/sumsq
index 8f8aa03..8f8aa03 100644..100755
--- a/06-Sum-Square-Difference/sumsq
+++ b/06-Sum-Square-Difference/sumsq
Binary files differ