Start writing printf() D:

This commit is contained in:
2025-06-25 11:08:56 +02:00
parent 1969294f02
commit dcb2b8acae

View File

@ -1,11 +1,15 @@
extern NR_write extern NR_write
extern strlen extern strlen
extern strcat
section .rodata section .rodata
NL db 0xA NL db 0xA
section .bss
printfBuff resb 4096
section .text section .text
global print global print
global puts global puts
global printf
;----- print (char* string) -----; ;----- print (char* string) -----;
; return value: N/A ; return value: N/A
@ -37,5 +41,113 @@ puts:
mov rdx, 1 mov rdx, 1
syscall 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 leave
ret ret