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 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