From 2d78510b9af6f70ec34d77f0e047c698bdf061a9 Mon Sep 17 00:00:00 2001 From: Mikhail Osipov Date: Sat, 12 Oct 2019 00:23:50 +0300 Subject: draft --- printf.s | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 printf.s (limited to 'printf.s') diff --git a/printf.s b/printf.s new file mode 100644 index 0000000..3bb24ca --- /dev/null +++ b/printf.s @@ -0,0 +1,120 @@ +.include "lib.s" + +.macro bufpush + cmpq $bufend, %rdi + jle 9f + stosb + 9: +.endm + +.globl printf +printf: + prologue + + backup %rax, %rbx, %rcx, %rdx + backup %rsi, %rdi + + movq 16(%rbp), %rsi + leaq 24(%rbp), %rbx + movq $buf, %rdi + +.loop: + lodsb + testb %al, %al + jz .loopout + + cmpb $'%, %al + jne .append + + lodsb + testb %al, %al + jz .loopout + + cmpb $'%, %al + je .append + + cmpb $'s, %al + je .print_string + + cmpb $'d, %al + je .print_signed + + cmpb $'u, %al + je .print_unsigned + + jmp .loop + +.append: + bufpush + jmp .loop + +.print_string: + backup %rsi + + movq (%rbx), %rsi + addq $8, %rbx + jmp 2f + + 1: bufpush + 2: lodsb + testb %al, %al + jnz 1b + + restore %rsi + jmp .loop + +.print_signed: + movq (%rbx), %rax + addq $8, %rbx + + cmpq $0, %rax + jge 1f + + pushq %rax + movb $'-, %al + bufpush + popq %rax + negq %rax + + 1: + movq $10, %rcx + call .print_number + jmp .loop + +.print_unsigned: + movq (%rbx), %rax + addq $8, %rbx + + movq $10, %rcx + call .print_number + jmp .loop + +.print_number: + xorq %rdx, %rdx + divq %rcx + pushq %rdx + testq %rax, %rax + jz 1f + call .print_number + 1: + popq %rax + addq $'0, %rax + bufpush + ret + +.loopout: + movq %rdi, %rdx + subq $buf, %rdx + movq $buf, %rsi + movq $STDOUT, %rdi + sys write + + restore %rsi, %rdi + restore %rax, %rbx, %rcx, %rdx + + leave + ret + +.bss +.comm buf, 4096 +.comm bufend, 2 -- cgit v1.2.3-70-g09d2