create counter program
This commit is contained in:
98
counter/counter.asm
Normal file
98
counter/counter.asm
Normal 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
|
||||
Reference in New Issue
Block a user