create counter program

This commit is contained in:
Joe Tretter
2025-08-29 13:01:16 -05:00
parent 4f9cd4066a
commit c4151260d0
2 changed files with 101 additions and 0 deletions

3
counter/compile Executable file
View File

@@ -0,0 +1,3 @@
nasm -f elf64 counter.asm -o counter.o
ld counter.o -o counter
./counter

98
counter/counter.asm Normal file
View File

@@ -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