From c4151260d02f53dbfba47985af809ec2a0e9be39 Mon Sep 17 00:00:00 2001 From: Joe Tretter Date: Fri, 29 Aug 2025 13:01:16 -0500 Subject: [PATCH] create counter program --- counter/compile | 3 ++ counter/counter.asm | 98 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100755 counter/compile create mode 100644 counter/counter.asm diff --git a/counter/compile b/counter/compile new file mode 100755 index 0000000..f572889 --- /dev/null +++ b/counter/compile @@ -0,0 +1,3 @@ + nasm -f elf64 counter.asm -o counter.o + ld counter.o -o counter + ./counter diff --git a/counter/counter.asm b/counter/counter.asm new file mode 100644 index 0000000..95ad91d --- /dev/null +++ b/counter/counter.asm @@ -0,0 +1,98 @@ +; nasm -f elf64 count.asm -o count.o +; ld count.o -o count +; ./count + +BITS 64 +SECTION .data + prefix db "Line ", 0 ; constant prefix string + newline db 10, 0 ; newline character "\n" + +SECTION .bss + numbuf resb 16 ; buffer to hold number string + +SECTION .text + global _start + +;---------------------------------------- +; _start: Entry point +;---------------------------------------- +_start: + mov r8, 1 ; counter (1 to 100) + +print_loop: + ; Print "Line " + mov rsi, prefix + call print_str + + ; Convert counter to string + mov rax, r8 + mov rdi, numbuf + call int_to_str + + ; Print number + mov rsi, numbuf + call print_str + + ; Print newline + mov rsi, newline + call print_str + + ; Increment and check loop condition + inc r8 + cmp r8, 100 + jle print_loop + + ; Exit syscall + mov rax, 60 + xor rdi, rdi + syscall + +;---------------------------------------- +; print_str: rsi = null-terminated string +;---------------------------------------- +print_str: + push rsi + mov rdi, rsi + xor rcx, rcx +.find_len: + cmp byte [rdi+rcx], 0 + je .got_len + inc rcx + jmp .find_len +.got_len: + mov rax, 1 ; sys_write + mov rdi, 1 ; fd = stdout + mov rdx, rcx ; length + mov rsi, rsi ; buffer + syscall + pop rsi + ret + +;---------------------------------------- +; int_to_str: rax = number, rdi = buffer +; Converts integer in RAX to ASCII string +; (null-terminated, left-justified) +;---------------------------------------- +int_to_str: + mov rcx, 0 + mov rbx, 10 + +.int_div_loop: + xor rdx, rdx + div rbx ; quotient in rax, remainder in rdx + push rdx + inc rcx + test rax, rax + jnz .int_div_loop + + ; Write digits to buffer + mov rsi, rdi +.write_digits: + pop rdx + add dl, '0' + mov [rsi], dl + inc rsi + loop .write_digits + + mov byte [rsi], 0 ; null terminator + ret