aboutsummaryrefslogtreecommitdiffstats
path: root/01-Multiples-of-3-and-5/asm/euler1.asm
diff options
context:
space:
mode:
Diffstat (limited to '01-Multiples-of-3-and-5/asm/euler1.asm')
-rw-r--r--01-Multiples-of-3-and-5/asm/euler1.asm42
1 files changed, 42 insertions, 0 deletions
diff --git a/01-Multiples-of-3-and-5/asm/euler1.asm b/01-Multiples-of-3-and-5/asm/euler1.asm
new file mode 100644
index 0000000..9541295
--- /dev/null
+++ b/01-Multiples-of-3-and-5/asm/euler1.asm
@@ -0,0 +1,42 @@
+extern printf
+SECTION .data
+flag: db "%d",10,0 ; "%d\n\0"
+
+SECTION .text
+ global main
+
+main:
+ push rbp ; set up stack
+ mov rbp, rsp
+ xor rax, rax ; start at multiple (i = 0)
+ mov r11, 0 ; sum = 0
+ mov r12, 1000 ; max = 1000
+.loop xor rdx, rdx ; clear rdx (remainder)
+ push rax ; save rax
+ mov rcx, 5 ; divisible by 5
+ div rcx ; divide rdx:rax/rcx
+ cmp rdx, 0 ; compare only remainder
+ jz .sum ; if r = 0 , add to sum
+ xor rdx,rdx ; clear rdx
+ mov rax, QWORD [rsp] ; reload rax
+ mov rcx, 3 ; divisible by 3
+ div rcx ; divide rdx:rax/rcx
+ cmp rdx, 0 ; compare only remainder
+ jnz .next ; if r = 0 , add to sum
+
+.sum add r11, QWORD [rsp] ; add to sum register
+
+.next pop rax ; return rax value from stack to be inc
+ inc rax ; i++
+ cmp rax, r12 ; while rax < r12 (1000)
+ jl .loop ; repeat
+
+ mov rdi, flag ; arg 1 (format)
+ mov rsi, r11 ; arg 2 (value)
+ mov rax, 0 ; no xmm registers
+ call printf wrt ..plt
+ pop rbp
+
+ mov rax, 0
+ ret
+