printf(): Start adding padding support (right now just detect it and calculate padding length)
This commit is contained in:
10
src/PRINTF_PADDING_TEST.asm
Normal file
10
src/PRINTF_PADDING_TEST.asm
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
%include "src/constants.asm"
|
||||||
|
extern printf
|
||||||
|
section .rodata
|
||||||
|
msg db "%133769666b",NL,EOS
|
||||||
|
section .text
|
||||||
|
global _start
|
||||||
|
_start:
|
||||||
|
lea rdi, [rel msg]
|
||||||
|
mov rsi, 6
|
||||||
|
call printf
|
@@ -83,6 +83,7 @@ puts:
|
|||||||
; r9* (optional arg) >> Keeps track of where to jump after flushing buffer
|
; r9* (optional arg) >> Keeps track of where to jump after flushing buffer
|
||||||
; r10* Keeps track of current index of printfBuff
|
; r10* Keeps track of current index of printfBuff
|
||||||
; r11* Keeps track of total characters (return value)
|
; r11* Keeps track of total characters (return value)
|
||||||
|
; r12 Padding for numbers (0=nopadding, >0=padding w/ spaces, NOT >0=padding w/ zeroes)
|
||||||
printf:
|
printf:
|
||||||
%macro load_arg 1
|
%macro load_arg 1
|
||||||
cmp rdx, 4
|
cmp rdx, 4
|
||||||
@@ -147,6 +148,49 @@ printf:
|
|||||||
je .wrapup
|
je .wrapup
|
||||||
cmp byte [rdi + 1], '%'
|
cmp byte [rdi + 1], '%'
|
||||||
je .rep_pct
|
je .rep_pct
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
cmp byte [rdi + 1], '1' ;zero padding later!
|
||||||
|
jb .noPadding
|
||||||
|
cmp byte [rdi + 1], '9'
|
||||||
|
jg .noPadding
|
||||||
|
|
||||||
|
inc rdi ;point to after '%'
|
||||||
|
xor rcx, rcx ;length of padding number (set to 0 first)
|
||||||
|
.findPaddingNumLen:
|
||||||
|
cmp byte [rdi], EOS
|
||||||
|
je .wrapup
|
||||||
|
cmp byte [rdi], '0'
|
||||||
|
jb .getPadding
|
||||||
|
cmp byte [rdi], '9'
|
||||||
|
ja .getPadding
|
||||||
|
inc rcx
|
||||||
|
inc rdi
|
||||||
|
jmp .findPaddingNumLen
|
||||||
|
.getPadding:
|
||||||
|
dec rdi ;dont break .noPadding below (for cmp rdi+1)
|
||||||
|
push rdi
|
||||||
|
push rax
|
||||||
|
xor rax, rax
|
||||||
|
xor r12, r12 ;total len
|
||||||
|
mov r9, 1
|
||||||
|
.getPaddingLoop:
|
||||||
|
xor rax, rax
|
||||||
|
mov al, byte [rdi]
|
||||||
|
sub al, '0'
|
||||||
|
imul r9
|
||||||
|
add r12, rax
|
||||||
|
dec rdi
|
||||||
|
mov rax, r9
|
||||||
|
mov r9, 10
|
||||||
|
imul r9
|
||||||
|
mov r9, rax
|
||||||
|
loop .getPaddingLoop
|
||||||
|
pop rax
|
||||||
|
pop rdi ;r12 should now store padding length
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
; OK so at this point, padding (spaces, zeroes not yet supported) length is calculated correctly and string is replaced correctly.
|
||||||
|
; Now what remains is to actually add the spaces (and zeroes, eventually)
|
||||||
|
.noPadding:
|
||||||
cmp byte [rdi + 1], 'c'
|
cmp byte [rdi + 1], 'c'
|
||||||
je .rep_c
|
je .rep_c
|
||||||
cmp byte [rdi + 1], 'i'
|
cmp byte [rdi + 1], 'i'
|
||||||
@@ -298,5 +342,6 @@ printf:
|
|||||||
xor rax, rax
|
xor rax, rax
|
||||||
|
|
||||||
.quit:
|
.quit:
|
||||||
|
pop r12
|
||||||
leave
|
leave
|
||||||
ret
|
ret
|
||||||
|
Reference in New Issue
Block a user