99 lines
1.9 KiB
NASM
99 lines
1.9 KiB
NASM
; 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
|