From eec2c5ea193abd20e81d9892f03a36624a09f462 Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Tue, 5 Aug 2025 13:51:59 +0200 Subject: [PATCH] asm --- scripts/asm | 8 ++++ scripts/prepare.sh | 3 ++ src/fb.asm | 115 +++++++++++++++++++++++++++++++++++++++++++++ src/fb.py | 4 +- 4 files changed, 128 insertions(+), 2 deletions(-) create mode 100755 scripts/asm create mode 100755 scripts/prepare.sh create mode 100644 src/fb.asm diff --git a/scripts/asm b/scripts/asm new file mode 100755 index 0000000..cfafffa --- /dev/null +++ b/scripts/asm @@ -0,0 +1,8 @@ +#!/bin/sh +set -e + +bash ./scripts/prepare.sh + +nasm -f elf64 -o build/fb.o src/fb.asm +gcc -no-pie -o bin/fb_asm build/fb.o -lc +bin/fb_asm diff --git a/scripts/prepare.sh b/scripts/prepare.sh new file mode 100755 index 0000000..626f72e --- /dev/null +++ b/scripts/prepare.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +mkdir -p bin build diff --git a/src/fb.asm b/src/fb.asm new file mode 100644 index 0000000..296137d --- /dev/null +++ b/src/fb.asm @@ -0,0 +1,115 @@ + ; use the build-linux.sh script to assemble and link this + bits 64 + + section .note.GNU-stack + + section .text + + default rel; idk what this means? + global main + extern printf + extern exit + align 16 + + %macro check 2 + mov rax, [rsp] + mov rbx, %1 + mov rdx, 0 + div rbx; dividend is rax. rdx has remainder and rax has the quotient + cmp rdx, 0 + je %2 + %endmacro + +main: + enter 16, 0 + + mov rcx, 1; iterator + mov rbx, 0; temp var + mov rax, 0; temp var + + push rcx; save iter on stack + +.loop: + ; show iteration + ;mov rax, [rsp]; read iter from stack + ;call piter + + check 15, .hboth + check 3, .hfizz + check 5, .hbuzz + ; else + jmp .hpnum + +.hboth: + call fizz + call buzz + call nl + jmp .loopend + +.hfizz: + call fizz + call nl + jmp .loopend + +.hbuzz: + call buzz + call nl + jmp .loopend + +.hpnum: + mov rax, [rsp] + call pnum + jmp .loopend + +.loopend: + pop rcx + inc rcx + push rcx + cmp rcx, 100 + jle .loop + ; end of loop + +.end: + leave + call exit + +fizz: + mov rdi, Lfizz + call printf + ret + +buzz: + mov rdi, Lbuzz + call printf + ret + +nl: + mov rdi, Lnl + call printf + ret + +pnum: + ; see https: // www.mourtada.se/calling-printf-from-the-c-standard-library-in-assembly/ + mov rdi, Lnumf + mov rsi, rax + mov rax, 0 + call printf + ret + +section .rodata + +Lfizz: + db "Fizz", 0 + .len equ $ - Lfizz + +Lbuzz: + db "Buzz", 0 + .len equ $ - Lbuzz + +Lnl: + db 0x0a, 0 + .len equ $ - Lnl + +Lnumf: + db "%d", 10, 0 + .len equ $ - Lnumf diff --git a/src/fb.py b/src/fb.py index 4d3aa6a..a09ecf2 100644 --- a/src/fb.py +++ b/src/fb.py @@ -1,9 +1,9 @@ for i in range(1,101): if i % 15 == 0 : print("FizzBuzz") - elif i % 5 == 0 : - print("Fizz") elif i % 3 == 0 : + print("Fizz") + elif i % 5 == 0 : print("Buzz") else: print(i)