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
|
cmp byte [rdi], 0
|
||||||
je .finish
|
je .finish
|
||||||
cmp byte [rdi], '%'
|
cmp byte [rdi], '%'
|
||||||
je .repArg
|
je .replaceArg
|
||||||
mov r12b, byte [rdi]
|
mov r12b, byte [rdi]
|
||||||
mov byte [r11], r12b
|
mov byte [r11], r12b
|
||||||
jmp .continue
|
jmp .continue
|
||||||
.repArg:
|
.replaceArg:
|
||||||
cmp byte [rdi+1], 0
|
cmp byte [rdi+1], 0
|
||||||
je .finish
|
je .finish
|
||||||
cmp byte [rdi+1], 'd'
|
cmp byte [rdi+1], 'd'
|
||||||
@ -71,34 +71,14 @@ printf:
|
|||||||
je .rep_s
|
je .rep_s
|
||||||
|
|
||||||
.rep_d:
|
.rep_d:
|
||||||
;mov byte [r11], 'D' ;%d => Dd
|
;TODO
|
||||||
;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
|
jmp .continue
|
||||||
|
|
||||||
.rep_s:
|
.rep_s:
|
||||||
|
push rdi
|
||||||
;mov byte [r11], 's' ;%s => Ss
|
;mov byte [r11], 's' ;%s => Ss
|
||||||
cmp r10, 0
|
cmp r10, 0
|
||||||
je .startInsert
|
je .sinsertLoop ;nothing to do, rsi already correct
|
||||||
cmp r10, 1
|
cmp r10, 1
|
||||||
je .rep_s_rdx
|
je .rep_s_rdx
|
||||||
cmp r10, 2
|
cmp r10, 2
|
||||||
@ -108,40 +88,39 @@ printf:
|
|||||||
cmp r10, 4
|
cmp r10, 4
|
||||||
je .rep_s_r9
|
je .rep_s_r9
|
||||||
|
|
||||||
push rdi
|
|
||||||
sub rsp, 8
|
|
||||||
lea rdi, [rel printfBuff]
|
|
||||||
|
|
||||||
;get from stack
|
;get from stack
|
||||||
mov rsi, qword [rbp + r10*8]
|
mov rsi, qword [rbp + r10*8]
|
||||||
|
|
||||||
.rep_s_rdx:
|
.rep_s_rdx:
|
||||||
mov rsi, rdx
|
mov rsi, rdx
|
||||||
jmp .startInsert
|
jmp .sinsertLoop
|
||||||
.rep_s_rcx:
|
.rep_s_rcx:
|
||||||
mov rsi, rcx
|
mov rsi, rcx
|
||||||
jmp .startInsert
|
jmp .sinsertLoop
|
||||||
.rep_s_r8:
|
.rep_s_r8:
|
||||||
mov rsi, r8
|
mov rsi, r8
|
||||||
jmp .startInsert
|
jmp .sinsertLoop
|
||||||
.rep_s_r9:
|
.rep_s_r9:
|
||||||
mov rsi, r9
|
mov rsi, r9
|
||||||
|
|
||||||
.startInsert:
|
.sinsertLoop:
|
||||||
mov rdi, rsi
|
cmp byte [rsi], 0x0
|
||||||
call strlen
|
je .s0f
|
||||||
mov r13, rax
|
mov r13b, byte [rsi]
|
||||||
call strcat
|
mov byte [r11], r13b
|
||||||
add r11, r13
|
inc rsi
|
||||||
add r10, 2 ;skip '%' and 'd/s'
|
inc r11
|
||||||
add rsp, 8
|
jmp .sinsertLoop
|
||||||
|
.s0f:
|
||||||
|
inc r10
|
||||||
pop rdi
|
pop rdi
|
||||||
|
inc rdi
|
||||||
.continue:
|
.continue:
|
||||||
inc rdi
|
inc rdi
|
||||||
inc r11
|
inc r11
|
||||||
jmp .makeStr
|
jmp .makeStr
|
||||||
.finish:
|
.finish:
|
||||||
mov byte [r11+1], 0x0
|
mov byte [r11], 0x0
|
||||||
lea rdi, [rel printfBuff]
|
lea rdi, [rel printfBuff]
|
||||||
call print
|
call print
|
||||||
|
|
||||||
|
44
tests.asm
44
tests.asm
@ -29,24 +29,25 @@ extern fclose
|
|||||||
extern fwrite
|
extern fwrite
|
||||||
|
|
||||||
section .rodata
|
section .rodata
|
||||||
PRINT_nums equ 1
|
PRINT_nums equ 0
|
||||||
PRINT_strs equ 1
|
PRINT_strs equ 1
|
||||||
TEST_print equ 1
|
TEST_print equ 0
|
||||||
TEST_puts equ 1
|
TEST_puts equ 0
|
||||||
TEST_min equ 1 ;includes minu
|
TEST_printf equ 1
|
||||||
TEST_max equ 1 ;includes maxu
|
TEST_min equ 0 ;includes minu
|
||||||
TEST_strlen equ 1
|
TEST_max equ 0 ;includes maxu
|
||||||
TEST_islower equ 1
|
TEST_strlen equ 0
|
||||||
TEST_isupper equ 1
|
TEST_islower equ 0
|
||||||
TEST_strcpy equ 1
|
TEST_isupper equ 0
|
||||||
TEST_strlcpy equ 1
|
TEST_strcpy equ 0
|
||||||
TEST_strclr equ 1
|
TEST_strlcpy equ 0
|
||||||
TEST_strlclr equ 1
|
TEST_strclr equ 0
|
||||||
TEST_strcat equ 1
|
TEST_strlclr equ 0
|
||||||
TEST_tolower equ 1
|
TEST_strcat equ 0
|
||||||
TEST_toupper equ 1
|
TEST_tolower equ 0
|
||||||
TEST_strcmp equ 1
|
TEST_toupper equ 0
|
||||||
TEST_file1 equ 1
|
TEST_strcmp equ 0
|
||||||
|
TEST_file1 equ 0
|
||||||
|
|
||||||
num1 dq 69
|
num1 dq 69
|
||||||
num2 dq 0xFFFFFF
|
num2 dq 0xFFFFFF
|
||||||
@ -66,6 +67,9 @@ section .rodata
|
|||||||
; puts()
|
; puts()
|
||||||
msgPuts db NL,NL,"# puts()",NL,EOS
|
msgPuts db NL,NL,"# puts()",NL,EOS
|
||||||
msgPuts1 db "puts() test",EOS
|
msgPuts1 db "puts() test",EOS
|
||||||
|
; printf()
|
||||||
|
msgPrintf db NL,"# printf()",EOS
|
||||||
|
msgPrintf1 db "TEST printf()",NL,EOS
|
||||||
; min() / minu()
|
; min() / minu()
|
||||||
msgMin db NL,"# min() / minu()",EOS
|
msgMin db NL,"# min() / minu()",EOS
|
||||||
msgMin1 db "TEST min(num1, num2): %d",NL,EOS
|
msgMin1 db "TEST min(num1, num2): %d",NL,EOS
|
||||||
@ -197,6 +201,12 @@ main:
|
|||||||
lea rdi, [rel msgPuts1]
|
lea rdi, [rel msgPuts1]
|
||||||
call puts
|
call puts
|
||||||
%ENDIF
|
%ENDIF
|
||||||
|
%IF TEST_printf
|
||||||
|
lea rdi, [rel msgPrintf]
|
||||||
|
call puts
|
||||||
|
lea rdi, [rel msgPrintf1]
|
||||||
|
call printf
|
||||||
|
%ENDIF
|
||||||
%IF TEST_min
|
%IF TEST_min
|
||||||
lea rdi, [rel msgMin]
|
lea rdi, [rel msgMin]
|
||||||
call puts
|
call puts
|
||||||
|
Reference in New Issue
Block a user