; 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