printf() no longer crashes, can print string but now aborts after printing first string
This commit is contained in:
61
console.asm
61
console.asm
@ -58,11 +58,11 @@ printf:
|
||||
cmp byte [rdi], 0
|
||||
je .finish
|
||||
cmp byte [rdi], '%'
|
||||
je .repArg
|
||||
je .replaceArg
|
||||
mov r12b, byte [rdi]
|
||||
mov byte [r11], r12b
|
||||
jmp .continue
|
||||
.repArg:
|
||||
.replaceArg:
|
||||
cmp byte [rdi+1], 0
|
||||
je .finish
|
||||
cmp byte [rdi+1], 'd'
|
||||
@ -71,34 +71,14 @@ printf:
|
||||
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
|
||||
;TODO
|
||||
jmp .continue
|
||||
|
||||
.rep_s:
|
||||
push rdi
|
||||
;mov byte [r11], 's' ;%s => Ss
|
||||
cmp r10, 0
|
||||
je .startInsert
|
||||
je .sinsertLoop ;nothing to do, rsi already correct
|
||||
cmp r10, 1
|
||||
je .rep_s_rdx
|
||||
cmp r10, 2
|
||||
@ -108,40 +88,39 @@ printf:
|
||||
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
|
||||
jmp .sinsertLoop
|
||||
.rep_s_rcx:
|
||||
mov rsi, rcx
|
||||
jmp .startInsert
|
||||
jmp .sinsertLoop
|
||||
.rep_s_r8:
|
||||
mov rsi, r8
|
||||
jmp .startInsert
|
||||
jmp .sinsertLoop
|
||||
.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
|
||||
.sinsertLoop:
|
||||
cmp byte [rsi], 0x0
|
||||
je .s0f
|
||||
mov r13b, byte [rsi]
|
||||
mov byte [r11], r13b
|
||||
inc rsi
|
||||
inc r11
|
||||
jmp .sinsertLoop
|
||||
.s0f:
|
||||
inc r10
|
||||
pop rdi
|
||||
inc rdi
|
||||
.continue:
|
||||
inc rdi
|
||||
inc r11
|
||||
jmp .makeStr
|
||||
.finish:
|
||||
mov byte [r11+1], 0x0
|
||||
mov byte [r11], 0x0
|
||||
lea rdi, [rel printfBuff]
|
||||
call print
|
||||
|
||||
|
Reference in New Issue
Block a user