diff --git a/src/main.asm b/src/main.asm index 054b942..c2a7d04 100644 --- a/src/main.asm +++ b/src/main.asm @@ -1,115 +1,118 @@ -SYS_WRITE equ 1 -SYS_BRK equ 12 -SYS_EXIT equ 60 -STDOUT equ 1 - -ESC_CHAR equ 27 -ASCII_ZERO equ 48 +SYS_WRITE equ 1 +SYS_BRK equ 12 +SYS_EXIT equ 60 +STDOUT equ 1 +ESC_CHAR equ 27 +ASCII_ZERO equ 48 section .bss - heap_ptr resp 1 +heap_ptr resq 1 ; Changed 'resp' to 'resq' section .data - hello: db ESC_CHAR, "[10;15Hhello suckers! :)", 10, 0 - test: db ESC_CHAR, "[20;25Hmore txt here", 10, 0 - clear: db ESC_CHAR, "[2J", 0 +hello: db ESC_CHAR, "[10;15Hhello suckers! :)", 10, 0 +test: db ESC_CHAR, "[20;25Hmore txt here", 10, 0 +clear: db ESC_CHAR, "[2J", 0 section .text - global _start - - unsigned_int_to_acii: ; takes value stored in rdi - push rdx +global _start + +unsigned_int_to_acii: ; takes value stored in rdi push r12 push r13 - mov r12, rdi - - mov rax,SYS_BRK - mov rdi,0 - syscall - mov [heap_ptr], rax - mov r13, 0 mov rax, r12 mov rcx, 10 - .count_loop: - inc r13 - cmp rax, 10 - jl .loop_exit - xor rdx, rdx - div rcx - push rdx - jmp .count_loop +.count_loop: + inc r13 + cmp rax, 10 + jl .loop_count_exit + xor rdx, rdx + div rcx + push rdx + jmp .count_loop - .loop_count_exit: +.loop_count_exit: push rax - mov rdi, [heap_ptr] add rdi, r13 inc rdi mov rax, SYS_BRK syscall - - mov rdi [heap_ptr] - mov rcx 0 - .store_loop: ; basicly for loop - cmp rcx, rdi - jnl .loop_store_exit - pop rax - add rax, ASCII_ZERO - - mov rdx rdi - add rdx rcx - mov byte rdx, rax - - inc rcx - jmp .store_loop + mov r14, rdi + mov rdi, [heap_ptr] + mov [heap_ptr], r14 + mov rcx, 0 - .loop_store_exit - add rdi rcx - mov byte rdi, 0 - +.store_loop: ; basicly for loop + cmp rcx, r13 + jnl .loop_store_exit + pop rax + add rax, ASCII_ZERO + mov rdx, rdi + add rdx, rcx + mov byte [rdx], al + inc rcx + jmp .store_loop - print_str: ; takes pointer to string in rdi and retuns in rax +.loop_store_exit: + + mov rax, rdi + add rdi, rcx + mov byte [rdi], 0 + mov rdx, rcx + + pop r13 + pop r12 + ret; return pointer to string in rax and lenght in rdx + +print_str: ; takes pointer to string in rdi and retuns in rax push rsi push rdx mov rsi, rdi - mov rdx, 0 - .count_loop: - cmp byte [rsi+rdx], 0 - je .print - inc rdx - jmp .count_loop - .print: - mov rax,SYS_WRITE - mov rdi,STDOUT - syscall - - pop rdx - pop rsi - ret +.count_loop: + cmp byte [rsi+rdx], 0 + je .print + inc rdx + jmp .count_loop - print_at_pos: - - - - _start: - mov rdi,clear - call print_str - - mov rdi,hello - call print_str - - mov rdi,test - call print_str - - mov rax,SYS_EXIT - mov rdi,0; return code +.print: + mov rax, SYS_WRITE + mov rdi, STDOUT syscall + pop rdx + pop rsi + ret + +print_at_pos: ; This function appears to be incomplete + +_start: + mov rdi, clear + call print_str + mov rdi, hello + call print_str + mov rdi, test + call print_str + + mov rax, SYS_BRK + mov rdi, 0 + syscall + mov [heap_ptr], rax + + mov rdi, 6969 + call unsigned_int_to_acii + + mov rdi, rax + call print_str + + mov rax, SYS_EXIT + mov rdi, 0 ; return code + syscall +