diff options
Diffstat (limited to '05-Smallest-Multiple/asm/smallmult.asm')
-rw-r--r-- | 05-Smallest-Multiple/asm/smallmult.asm | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/05-Smallest-Multiple/asm/smallmult.asm b/05-Smallest-Multiple/asm/smallmult.asm new file mode 100644 index 0000000..c154ff3 --- /dev/null +++ b/05-Smallest-Multiple/asm/smallmult.asm @@ -0,0 +1,44 @@ +; 2520 is the smallest number that can be divided by each of the numbers +; from 1 to 10 without any remainder. +; What is the smallest positive number that is evenly divisible by all +; of the numbers from 1 to 20? + +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 + + mov rax, 2520 ; value to start at (given) + mov rcx, 20 ; divisor (counting down) +.loop add rax, rcx + push rcx +.isdiv xor rdx, rdx ; clear rdx for div + push rax ; save rax before dividing + div rcx ; rdx:rax/rcx = rax remainder rdx + pop rax ; reload rax to be divided again + cmp rdx, 0 ; the number was divisible, keep going + loopz .isdiv ; loop exits if rdx is non zero OR rcx is 0 + cmp rcx, 0 ; if rcx = 0, it means it looped 20 to 1 w/o + jz .print ; any remainders, that's our number! + ; if you get here, number couldn't be evenly divided by all numbers + pop rcx + jmp .loop + + + +.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 + |