Files
klibc/tests.asm

385 lines
7.2 KiB
NASM

extern printf
;constants.asm
extern EOS
extern NL
;core.asm
extern min
extern minu
extern max
extern maxu
extern islower
extern isupper
extern tolower
extern toupper
;console.asm
extern print
extern puts
;string.asm
extern strlen
extern strcpy
extern strlcpy
extern strcat
extern strcmp
section .rodata
PRINT_nums equ 1
PRINT_strs equ 1
TEST_min equ 1 ;includes minu
TEST_max equ 1 ;includes maxu
TEST_print equ 1
TEST_puts equ 1
TEST_strlen equ 1
TEST_islower equ 1
TEST_isupper equ 1
TEST_strcpy equ 1
TEST_strlcpy equ 1
TEST_strcat equ 1
TEST_tolower equ 1
TEST_toupper equ 1
TEST_strcmp equ 1
num1 dq 13
num2 dq -25
num3 equ 60
msgNums db "> num1: %d",NL,"> num2: %d",NL,"> num3: %d",NL,EOS
msgMin db "min(num1, num2): %d",NL,EOS
msgMin2 db "minu(num1, num3): %d",NL,EOS
msgMin3 db "min(num2, num3): %d",NL,EOS
msgMax db "max(num1, num2): %d",NL,EOS
msgMax2 db "maxu(num1, num3): %d",NL,EOS
msgMax3 db "max(num2, num3): %d",NL,EOS
msgPrint db "print() test",EOS
msgPuts db " and puts() test",EOS
str1 db "Hello, world!",EOS
str2 db "Hello World!",EOS
str3 db "Howdy environment!",EOS
msgStrings db "> str1: %s",NL,"> str2: %s",NL,"> str3: %s",NL,EOS
msgStrlen db "strlen(str1): %d",NL,EOS
msgStrlen2 db "strlen(str3): %d",NL,EOS
msgIslower db "islower(str1[0]): %d",NL,EOS
msgIslower2 db "islower(str1[1]): %d",NL,EOS
msgIsupper db "isupper(str1[0]): %d",NL,EOS
msgIsupper2 db "isupper(str1[1]): %d",NL,EOS
msgStrcpy db "strcpy(strBuff, str1): %s",NL,EOS
msgStrlcpy db "strlcpy(strBuff2, str1, -1): (%d): %s",NL,EOS
msgStrlcpy2 db "strlcpy(strBuff2, str1, 0): (%d): %s",NL,EOS
msgStrlcpy3 db "strlcpy(strBuff2, str1, 5): (%d): %s",NL,EOS
msgStrcat db "strcat(strBuff, str3): %s",NL,EOS
msgStrlen3 db "strlen(strBuff): %d",NL,EOS
msgTolower db "tolower(str1[0]): %c",NL,EOS
msgTolower2 db "tolower(str1[1]): %c",NL,EOS
msgTolower3 db "tolower() for whole strBuff: %s",NL,EOS
msgToupper db "toupper(str1[0]): %c",NL,EOS
msgToupper2 db "toupper(str1[1]): %c",NL,EOS
msgToupper3 db "toupper() for whole strBuff: %s",NL,EOS
msgStrcmp db "strcmp(str1, str2): %d",NL,EOS
msgStrings2 db "Comparing...",NL,"> str1: %s",NL,"> strBuff: %s",NL,EOS
msgStrcmp2 db "strcmp(str1, strBuff): %d",NL,EOS
section .data
section .bss
strBuff resb 32
strBuff2 resb 5
section .text
global main
main:
push rbp
mov rbp, rsp
%IF PRINT_nums
; PRINT: num1, num2, num3
xor rax, rax
lea rdi, [rel msgNums]
mov rsi, [rel num1]
mov rdx, [rel num2]
mov rcx, num3
call printf
%ENDIF
%IF TEST_min
; TEST: min()
mov rdi, [rel num1]
mov rsi, [rel num2]
call min
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMin]
call printf
;
mov rdi, [rel num1]
mov rsi, num3
call minu
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMin2]
call printf
;
mov rdi, [rel num2]
mov rsi, num3
call min
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMin3]
call printf
%ENDIF
%IF TEST_max
; TEST: max()
mov rdi, [rel num1]
mov rsi, [rel num2]
call max
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMax]
call printf
;
mov rdi, [rel num1]
mov rsi, num3
call maxu
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMax2]
call printf
;
mov rdi, [rel num2]
mov rsi, num3
call max
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMax3]
call printf
%ENDIF
%IF TEST_print
; TEST: print()
lea rdi, [rel msgPrint]
call print
%ENDIF
%IF TEST_puts
; TEST: puts()
lea rdi, [rel msgPuts]
call puts
%ENDIF
%IF PRINT_strs
; PRINT: str1, str2, str3
xor rax, rax
lea rdi, [rel msgStrings]
lea rsi, [rel str1]
lea rdx, [rel str2]
lea rcx, [rel str3]
call printf
%ENDIF
%IF TEST_strlen
; TEST: strlen()
lea rdi, [rel str1]
call strlen
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrlen]
call printf
;
lea rdi, [rel str3]
call strlen
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrlen2]
call printf
%ENDIF
%IF TEST_islower
; TEST: islower()
lea rdi, [rel str1]
call islower
mov rsi, rax
xor rax, rax
lea rdi, [rel msgIslower]
call printf
;
lea rdi, [rel str1+1]
call islower
mov rsi, rax
xor rax, rax
lea rdi, [rel msgIslower2]
call printf
%ENDIF
%IF TEST_isupper
; TEST: isupper()
lea rdi, [rel str1]
call isupper
mov rsi, rax
xor rax, rax
lea rdi, [rel msgIsupper]
call printf
;
lea rdi, [rel str1+1]
call isupper
mov rsi, rax
xor rax, rax
lea rdi, [rel msgIsupper2]
call printf
%ENDIF
%IF TEST_strcpy
; TEST: strcpy()
lea rdi, [rel strBuff]
lea rsi, [rel str1]
call strcpy
xor rax, rax
lea rdi, [rel msgStrcpy]
lea rsi, [rel strBuff]
call printf
%ENDIF
%IF TEST_strlcpy
; TEST: strlcpy(strBuff2, str1, -1)
lea rdi, [rel strBuff2]
lea rsi, [rel str1]
mov rdx, -1
call strlcpy
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrlcpy]
lea rdx, [rel strBuff2]
call printf
; TEST: strlcpy(strBuff2, str1, 0)
lea rdi, [rel strBuff2]
lea rsi, [rel str1]
mov rdx, 0
call strlcpy
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrlcpy2]
lea rdx, [rel strBuff2]
call printf
; TEST: strlcpy(strBuff2, str1, 5)
lea rdi, [rel strBuff2]
lea rsi, [rel str1]
mov rdx, 5
call strlcpy
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrlcpy3]
lea rdx, [rel strBuff2]
call printf
%ENDIF
%IF TEST_strcat
; TEST: strcat()
lea rdi, [rel strBuff]
lea rsi, [rel str3]
call strcat
xor rax, rax
lea rdi, [rel msgStrcat]
lea rsi, [rel strBuff]
call printf
%ENDIF
%IF TEST_strcat
%IF TEST_strlen
; TEST: strlen() for strBuff
lea rdi, [rel strBuff]
call strlen
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrlen3]
call printf
%ENDIF
%ENDIF
%IF TEST_tolower
; TEST: tolower(str1[0])
lea rdi, [rel str1]
call tolower
mov rsi, rax
xor rax, rax
lea rdi, [rel msgTolower]
call printf
; ...str1[1]
lea rdi, [rel str1+1]
call tolower
mov rsi, rax
xor rax, rax
lea rdi, [rel msgTolower2]
call printf
%ENDIF
%IF TEST_toupper
; TEST: toupper(str1[0])
lea rdi, [rel str1]
call toupper
mov rsi, rax
xor rax, rax
lea rdi, [rel msgToupper]
call printf
; ...str1[1]
lea rdi, [rel str1+1]
call toupper
mov rsi, rax
xor rax, rax
lea rdi, [rel msgToupper2]
call printf
%ENDIF
%IF TEST_tolower
; TEST: tolower: entire strBuff
lea rdi, [rel strBuff]
call strlen
mov rcx, rax
.tolowerLoop:
movzx r10, byte [rdi]
mov byte [rdi], r10b
mov r11, rcx
call tolower
mov rcx, r11
mov byte [rdi], al
inc rdi
inc r10
loop .tolowerLoop
xor rax, rax
lea rdi, [rel msgTolower3]
lea rsi, [rel strBuff]
call printf
%ENDIF
%IF TEST_toupper
; TEST: toupper: entire strBuff
lea rdi, [rel strBuff]
call strlen
mov rcx, rax
.toupperLoop:
movzx r10, byte [rdi]
mov byte [rdi], r10b
mov r11, rcx
call toupper
mov rcx, r11
mov byte [rdi], al
inc rdi
inc r10
loop .toupperLoop
xor rax, rax
lea rdi, [rel msgToupper3]
lea rsi, [rel strBuff]
call printf
%ENDIF
%IF TEST_strcmp
; TEST: strcmp(str1, str2)
lea rdi, [rel str1]
lea rsi, [rel str2]
call strcmp
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrcmp]
call printf
;
lea rdi, [rel strBuff]
lea rsi, [rel str1]
call strcpy
lea rdi, [rel strBuff]
lea rsi, [rel str3]
call strcat
%IF PRINT_strs
xor rax, rax
lea rdi, [rel msgStrings2]
lea rsi, [rel str1]
lea rdx, [rel strBuff]
call printf
%ENDIF
lea rdi, [rel str1]
lea rsi, [rel strBuff]
call strcmp
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrcmp2]
call printf
%ENDIF
leave
ret