Start writing printf() D:
This commit is contained in:
112
console.asm
112
console.asm
@ -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
|
||||||
|
Reference in New Issue
Block a user