From dcb2b8acaea050465b0d91e86c802d197576d49f Mon Sep 17 00:00:00 2001 From: Kwarde Date: Wed, 25 Jun 2025 11:08:56 +0200 Subject: [PATCH] Start writing printf() D: --- console.asm | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 113 insertions(+), 1 deletion(-) diff --git a/console.asm b/console.asm index 2d82cec..8665205 100644 --- a/console.asm +++ b/console.asm @@ -1,11 +1,15 @@ extern NR_write extern strlen +extern strcat section .rodata - NL db 0xA + NL db 0xA +section .bss + printfBuff resb 4096 section .text global print global puts + global printf ;----- print (char* string) -----; ; return value: N/A @@ -37,5 +41,113 @@ puts: mov rdx, 1 syscall + leave + ret +;----- printf(const char* string, ...) -----; +printf: + push rbp + mov rbp, rsp + + push r12 + push r13 + ;sub rsp, 8 + + xor r10, r10 + lea r11, [rel printfBuff] + .makeStr: + cmp byte [rdi], 0 + je .finish + cmp byte [rdi], '%' + je .repArg + mov r12b, byte [rdi] + mov byte [r11], r12b + jmp .continue + .repArg: + cmp byte [rdi+1], 0 + je .finish + cmp byte [rdi+1], 'd' + je .rep_d + cmp byte [rdi+1], 's' + je .rep_s + + .rep_d: + ;mov byte [r11], 'D' ;%d => Dd + ;push rdi + cmp r10, 0 + je .rep_d_rsi + cmp r10, 1 + je .rep_d_rdx + cmp r10, 2 + je .rep_d_rcx + cmp r10, 3 + je .rep_d_r8 + cmp r10, 4 + je .rep_d_r9 + + ;get from stack + + .rep_d_rsi: + .rep_d_rdx: + .rep_d_rcx: + .rep_d_r8: + .rep_d_r9: + + inc r10 + jmp .continue + + .rep_s: + ;mov byte [r11], 's' ;%s => Ss + cmp r10, 0 + je .startInsert + cmp r10, 1 + je .rep_s_rdx + cmp r10, 2 + je .rep_s_rcx + cmp r10, 3 + je .rep_s_r8 + cmp r10, 4 + je .rep_s_r9 + + push rdi + sub rsp, 8 + lea rdi, [rel printfBuff] + + ;get from stack + mov rsi, qword [rbp + r10*8] + + .rep_s_rdx: + mov rsi, rdx + jmp .startInsert + .rep_s_rcx: + mov rsi, rcx + jmp .startInsert + .rep_s_r8: + mov rsi, r8 + jmp .startInsert + .rep_s_r9: + mov rsi, r9 + + .startInsert: + mov rdi, rsi + call strlen + mov r13, rax + call strcat + add r11, r13 + add r10, 2 ;skip '%' and 'd/s' + add rsp, 8 + pop rdi + .continue: + inc rdi + inc r11 + jmp .makeStr + .finish: + mov byte [r11+1], 0x0 + lea rdi, [rel printfBuff] + call print + + ;add rsp, 8 + pop r13 + pop r12 + leave ret