diff --git a/console.asm b/console.asm index 3efd0e9..248809f 100644 --- a/console.asm +++ b/console.asm @@ -69,6 +69,8 @@ printf: push rdi cmp byte [rdi+1], 'd' je .rep_d + cmp byte [rdi+1], 'c' + je .rep_c cmp byte [rdi+1], 's' je .rep_s @@ -118,12 +120,52 @@ printf: pop rdx pop rcx mov rsi, rax - jmp .sinsertLoop + jmp .insertLoop + + ;--- %c ---; + .rep_c: + cmp r10, 0 + je .rep_c_rsi + cmp r10, 1 + je .rep_c_rdx + cmp r10, 2 + je .rep_c_rcx + cmp r10, 3 + je .rep_c_r8 + cmp r10, 4 + je .rep_c_r9 + + ;get from stack + mov rdi, qword [rbp + 16 + (r10-5)*8] + jmp .charToStr + + .rep_c_rsi: + mov rdi, rsi + jmp .charToStr + .rep_c_rdx: + mov rdi, rdx + jmp .charToStr + .rep_c_rcx: + mov rdi, rcx + jmp .charToStr + .rep_c_r8: + mov rdi, r8 + jmp .charToStr + .rep_c_r9: + mov rdi, r9 + jmp .charToStr + + .charToStr: + mov [printfNBuff], dil + mov dil, 0 + mov [printfNBuff+1], dil + lea rsi, [rel printfNBuff] + jmp .insertLoop ;--- %s ---; .rep_s: cmp r10, 0 - je .sinsertLoop ;nothing to do, rsi already correct + je .insertLoop ;nothing to do, rsi already correct cmp r10, 1 je .rep_s_rdx cmp r10, 2 @@ -135,28 +177,29 @@ printf: ;get from stack mov rsi, qword [rbp + 16 + (r10-5)*8] - jmp .sinsertLoop + jmp .insertLoop .rep_s_rdx: mov rsi, rdx - jmp .sinsertLoop + jmp .insertLoop .rep_s_rcx: mov rsi, rcx - jmp .sinsertLoop + jmp .insertLoop .rep_s_r8: mov rsi, r8 - jmp .sinsertLoop + jmp .insertLoop .rep_s_r9: mov rsi, r9 - .sinsertLoop: + ;--- Move fetched data to buffer ---; + .insertLoop: cmp byte [rsi], 0x0 je .s0f mov r13b, byte [rsi] mov byte [r11], r13b inc rsi inc r11 - jmp .sinsertLoop + jmp .insertLoop .s0f: inc r10 pop rdi