Files
klibc/tests.asm

763 lines
16 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 strclr
extern strlclr
extern strcat
extern strcmp
;file.asm
extern fopen
extern fclose
extern fwrite
section .rodata
PRINT_nums equ 1
PRINT_strs equ 1
TEST_print equ 1
TEST_puts equ 1
TEST_min equ 1 ;includes minu
TEST_max equ 1 ;includes maxu
TEST_strlen equ 1
TEST_islower equ 1
TEST_isupper equ 1
TEST_strcpy equ 1
TEST_strlcpy equ 1
TEST_strclr equ 1
TEST_strlclr equ 1
TEST_strcat equ 1
TEST_tolower equ 1
TEST_toupper equ 1
TEST_strcmp equ 1
TEST_file1 equ 1
num1 dq 69
num2 dq 0xFFFFFF
num3 equ 25
num4 dq -90
prntNums db "PRINT numbers:",NL,"> num1: %d",NL,"> num2: %d",NL,"> num3: %d",NL,"> num4: %d",NL,EOS
str1 db "Hello, world!",EOS
str2 db "Hello world!",EOS
str3 db "Howdy environment!",EOS
str4 db "Hell",EOS"o world!",EOS
prntStrs db "PRINT strings:",NL,"> str1: %s",NL,"> str2: %s",NL,"> str3: %s",NL,"> str4: %s",NL,EOS
; print()
msgPrint db NL,"# print()",NL,EOS
msgPrint1 db "print() test",EOS
; puts()
msgPuts db NL,NL,"# puts()",NL,EOS
msgPuts1 db "puts() test",EOS
; min() / minu()
msgMin db NL,"# min() / minu()",EOS
msgMin1 db "TEST min(num1, num2): %d",NL,EOS
msgMin2 db "TEST minu(num1, num2): %d",NL,EOS
msgMin3 db "TEST min(num1, num3): %d",NL,EOS
msgMin4 db "TEST minu(num1, num3): %d",NL,EOS
msgMin5 db "TEST min(num1, num4): %d",NL,EOS
msgMin6 db "TEST minu(num1, num4): %d",NL,EOS
msgMin7 db "TEST min(num2, num4): %d",NL,EOS
msgMin8 db "TEST minu(num2, num4): %d",NL,EOS
; max() / maxu()
msgMax db NL,"# max() / maxu()",EOS
msgMax1 db "TEST max(num1, num2): %d",NL,EOS
msgMax2 db "TEST maxu(num1, num2): %d",NL,EOS
msgMax3 db "TEST max(num1, num3): %d",NL,EOS
msgMax4 db "TEST maxu(num1, num3): %d",NL,EOS
msgMax5 db "TEST max(num1, num4): %d",NL,EOS
msgMax6 db "TEST maxu(num1, num4): %d",NL,EOS
msgMax7 db "TEST max(num2, num4): %d",NL,EOS
msgMax8 db "TEST maxu(num2, num4): %d",NL,EOS
; strlen()
msgStrlen db NL,"# strlen()",EOS
msgStrlen1 db "TEST strlen(str1): %d",NL,EOS
msgStrlen2 db "TEST strlen(str2): %d",NL,EOS
msgStrlen3 db "TEST strlen(str3): %d",NL,EOS
msgStrlen4 db "TEST strlen(str4): %d",NL,EOS
; islower()
msgIslower db NL,"# islower()",EOS
msgIslower1 db "TEST islower(str1[0]): %d",NL,EOS ;str1[0] => 'H'
msgIslower2 db "TEST islower(str1[1]): %d",NL,EOS ;str1[1] => 'e'
msgIslower3 db "TEST islower(str1[5]): %d",NL,EOS ;str1[5] => ','
; isupper()
msgIsupper db NL,"# isupper()",EOS
msgIsupper1 db "TEST isupper(str1[0]): %d",NL,EOS ;str1[0] => 'H'
msgIsupper2 db "TEST isupper(str1[1]): %d",NL,EOS ;str1[1] => 'e'
msgIsupper3 db "TEST isupper(str1[5]): %d",NL,EOS ;str1[5] => ','
; strcpy()
msgStrcpy db NL,"# strcpy()",EOS
msgStrcpy1 db "TEST strcpy(strBuff1, str4): %s",NL,EOS
msgStrcpy2 db "TEST strcpy(strBuff1, str2): %s",NL,EOS
msgStrcpy3 db "TEST strcpy(strBuff1, str1): %s",NL,EOS
; strlcpy()
msgStrlcpy db NL,"# strlcpy()",EOS
msgStrlcpy1 db "TEST strlcpy(strBuff2, str1, -1) (%d): %s",NL,EOS
msgStrlcpy2 db "TEST strlcpy(strBuff2, str1, 0) (%d): %s",NL,EOS
msgStrlcpy3 db "TEST strlcpy(strBuff2, str1, 5) (%d): %s",NL,EOS
msgStrlcpy4 db "TEST strlcpy(strBuff2, str4, 8) (%d): %s",NL,EOS
; strclr()
msgStrclr db NL,"# strclr()",EOS
msgStrclr1 db "TEST strclr(strBuff1): (%d) %s",NL,EOS
msgStrclr2 db "> strcpy(strBuff1, str3). strBuff1 => %s",NL,EOS
msgStrclr3 db "TEST strclr(strBuff1): (%d) %s",NL,EOS
; strlclr()
msgStrlclr db NL,"# strlclr()",EOS
msgStrlclr1 db "TEST strlclr(strbuff1, 32): %s",NL,EOS
msgStrlclr2 db "> strcpy(strBuff1, str3). strBuff1 => %s",NL,EOS
msgStrlclr3 db "TEST strlclr(strBuff1, 32): %s",NL,EOS
; strcat()
msgStrcat db NL,"# strcat()",EOS
msgStrcat1 db "TEST strcat(strBuff1, str3): %s", NL,EOS
msgStrcat2 db "> strclr(strBuff1)",EOS
msgStrcat3 db "TEST strcat(strBuff1, str1): %s",NL,EOS
msgStrcat4 db "TEST strcat(strBuff1, str3): %s",NL,EOS
; tolower()
msgTolower db NL,"# tolower()",NL,"> strcpy(strBuff1, str3)",EOS
msgTolower1 db "TEST tolower(strBuff1[0]): %c",NL,EOS
msgTolower2 db "TEST tolower for whole strBuff1: %s",NL,EOS
; toupper()
msgToupper db NL,"# toupper()",NL,"> strcpy(strBuff1, str3)",EOS
msgToupper1 db "TEST toupper(strBuff1[0]): %c",NL,EOS
msgToupper2 db "TEST toupper for whole strBuff1: %s",NL,EOS
; strcmp()
msgStrcmp db NL,"# strcmp()",NL,"strlclr(strBuff1, 32)",NL,"strcpy(strBuff1, str1)",NL,"toupper(strBuff1[7])",EOS
msgStrcmpStrs db "> str1: %s",NL,"> str2: %s",NL,"> str4: %s",NL,"> strBuff1: %s",NL,EOS
msgStrcmp1 db "TEST strcmp(strBuff1, str1): %d",NL,EOS
msgStrcmp2 db "TEST strcmp(str1, str2): %d",NL,EOS
msgStrcmp3 db "TEST strcmp(strBuff1, str2): %d",NL,EOS
msgStrcmp4 db "TEST strcmp(str4, str1): %d",NL,EOS
msgStrcmp5 db "TEST strcmp(str1, str4): %d",NL,EOS
msgStrcmp6 db "TEST strcmp(str1, str1): %d",NL,EOS
; fopen(), fwrite(), fclose()
testFile1 db "testFile1.txt",EOS
fileStr1 db "Hello file world!",EOS
msgFileB db NL,"# fopen(), fwrite(), fclose()",EOS
msgFileB1 db "TEST fopen('testFile1.txt', 'w'): %d",NL,EOS
msgFileB2 db "TEST fwrite(filePointer1, fileStr1): %d",NL,EOS
msgFileB3 db "TEST fclose(filePointer1): %d",NL,EOS
section .data
filePointer1 dq 0
section .bss
strBuff1 resb 32
strBuff2 resb 8
section .text
global main
main:
push rbp
mov rbp, rsp
%IF PRINT_nums
xor rax, rax
lea rdi, [rel prntNums]
mov rsi, [rel num1]
mov rdx, [rel num2]
mov rcx, num3
mov r8, [rel num4]
call printf
%ENDIF
%IF PRINT_strs
xor rax, rax
lea rdi, [rel prntStrs]
lea rsi, [rel str1]
lea rdx, [rel str2]
lea rcx, [rel str3]
lea r8, [rel str4]
call printf
%ENDIF
%IF TEST_print
xor rax, rax
lea rdi, [rel msgPrint]
call printf
lea rdi, [rel msgPrint1]
call print
%ENDIF
%IF TEST_puts
xor rax, rax
lea rdi, [rel msgPuts]
call printf
lea rdi, [rel msgPuts1]
call puts
%ENDIF
%IF TEST_min
lea rdi, [rel msgMin]
call puts
;TEST: min(num1, num2)
mov rdi, [rel num1]
mov rsi, [rel num2]
call min
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMin1]
call printf
;TEST: minu(num1, num2)
mov rdi, [rel num1]
mov rsi, [rel num2]
call minu
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMin2]
call printf
;TEST: min(num1, num3)
mov rdi, [rel num1]
mov rsi, num3
call min
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMin3]
call printf
;TEST: minu(num1, num3)
mov rdi, [rel num1]
mov rsi, num3
call minu
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMin4]
call printf
;TEST: min(num1, num4)
mov rdi, [rel num1]
mov rsi, [rel num4]
call min
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMin5]
call printf
;TEST: minu(num1, num4)
mov rdi, [rel num1]
mov rsi, [rel num4]
call minu
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMin6]
call printf
;TEST: min(num2, num4)
mov rdi, [rel num2]
mov rsi, [rel num4]
call min
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMin7]
call printf
;TEST: minu(num2, num4)
mov rdi, [rel num2]
mov rsi, [rel num4]
call minu
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMin8]
call printf
%ENDIF
%IF TEST_max
lea rdi, [rel msgMax]
call puts
;TEST: max(num1, num2)
mov rdi, [rel num1]
mov rsi, [rel num2]
call max
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMax1]
call printf
;TEST: maxu(num1, num2)
mov rdi, [rel num1]
mov rsi, [rel num2]
call maxu
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMax2]
call printf
;TEST: max(num1, num3)
mov rdi, [rel num1]
mov rsi, num3
call max
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMax3]
call printf
;TEST: maxu(num1, num3)
mov rdi, [rel num1]
mov rsi, num3
call maxu
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMax4]
call printf
;TEST: max(num1, num4)
mov rdi, [rel num1]
mov rsi, [rel num4]
call max
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMax5]
call printf
;TEST: maxu(num1, num4)
mov rdi, [rel num1]
mov rsi, [rel num4]
call maxu
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMax6]
call printf
;TEST: max(num2, num4)
mov rdi, [rel num2]
mov rsi, [rel num4]
call max
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMax7]
call printf
;TEST: maxu(num2, num4)
mov rdi, [rel num2]
mov rsi, [rel num4]
call maxu
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMax8]
call printf
%ENDIF
%IF TEST_strlen
lea rdi, [rel msgStrlen]
call puts
; TEST: strlen(str1)
lea rdi, [rel str1]
call strlen
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrlen1]
call printf
; TEST: strlen(str2)
lea rdi, [rel str2]
call strlen
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrlen2]
call printf
; TEST: strlen(str3)
lea rdi, [rel str3]
call strlen
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrlen3]
call printf
; TEST: strlen(str4)
lea rdi, [rel str4]
call strlen
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrlen4]
call printf
%ENDIF
%IF TEST_islower
lea rdi, [rel msgIslower]
call puts
; TEST: islower(str1[0])
lea rdi, [rel str1]
call islower
mov rsi, rax
xor rax, rax
lea rdi, [rel msgIslower1]
call printf
; TEST: islower(str1[1])
lea rdi, [rel str1+1]
call islower
mov rsi, rax
xor rax, rax
lea rdi, [rel msgIslower2]
call printf
; TEST: islower(str1[5])
lea rdi, [rel str1+5]
call islower
mov rsi, rax
xor rax, rax
lea rdi, [rel msgIslower3]
call printf
%ENDIF
%IF TEST_isupper
lea rdi, [rel msgIsupper]
call puts
; TEST: isupper(str1[0])
lea rdi, [rel str1]
call isupper
mov rsi, rax
xor rax, rax
lea rdi, [rel msgIsupper1]
call printf
; TEST: isupper(str1[1])
lea rdi, [rel str1+1]
call isupper
mov rsi, rax
xor rax, rax
lea rdi, [rel msgIsupper2]
call printf
; TEST: isupper(str1[5])
lea rdi, [rel str1+5]
call isupper
mov rsi, rax
xor rax, rax
lea rdi, [rel msgIsupper3]
call printf
%ENDIF
%IF TEST_strcpy
lea rdi, [rel msgStrcpy]
call puts
; TEST: strcpy(strBuff1, str4)
lea rdi, [rel strBuff1]
lea rsi, [rel str4]
call strcpy
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrcpy1]
call printf
; TEST: strcpy(strBuff1, str2)
lea rdi, [rel strBuff1]
lea rsi, [rel str2]
call strcpy
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrcpy2]
call printf
; TEST: strcpy(strBuff1, str1)
lea rdi, [rel strBuff1]
lea rsi, [rel str1]
call strcpy
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrcpy3]
call printf
%ENDIF
%IF TEST_strlcpy
lea rdi, [rel msgStrlcpy]
call puts
; 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 msgStrlcpy1]
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
; TEST: strlcpy(strBuff2, str4, 8)
lea rdi, [rel strBuff2]
lea rsi, [rel str4]
mov rdx, 8
call strlcpy
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrlcpy4]
lea rdx, [rel strBuff2]
call printf
%ENDIF
%IF TEST_strclr
lea rdi, [rel msgStrclr]
call puts
; TEST: strclr(strBuff1)
lea rdi, [rel strBuff1]
call strclr
mov rsi, rax
xor rax, rax
lea rdx, [rel strBuff1]
lea rdi, [rel msgStrclr1]
call printf
; str3->strBuff1
lea rdi, [rel strBuff1]
lea rsi, [rel str3]
call strcpy
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrclr2]
call printf
; TEST: strclr(strBuff1)
lea rdi, [rel strBuff1]
call strclr
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrclr3]
lea rdx, [rel strBuff1]
call printf
%ENDIF
%IF TEST_strlclr
lea rdi, [rel msgStrlclr]
call puts
; TEST: strlclr(strBuff1, 32)
lea rdi, [rel strBuff1]
mov rsi, 32
call strlclr
xor rax, rax
lea rdi, [rel msgStrlclr1]
lea rsi, [rel strBuff1]
call printf
; str3->strBuff1
lea rdi, [rel strBuff1]
lea rsi, [rel str3]
call strcpy
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrlclr2]
call printf
; TEST: strlclr(strBuff1, 32)
lea rdi, [rel strBuff1]
mov rsi, 32
call strlclr
xor rax, rax
lea rdi, [rel msgStrlclr3]
lea rsi, [rel strBuff1]
call printf
%ENDIF
%IF TEST_strcat
lea rdi, [rel msgStrcat]
call puts
; TEST: strcat(strBuff1, str3)
lea rdi, [rel strBuff1]
lea rsi, [rel str3]
call strcat
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrcat1]
call printf
; CLEAR strBuff1
lea rdi, [rel msgStrcat2]
call puts
lea rdi, [rel strBuff1]
call strclr
; TEST: strcat(strBuff1, str1)
lea rdi, [rel strBuff1]
lea rsi, [rel str1]
call strcat
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrcat3]
call printf
; TEST: strcat(strBuff1, str3)
lea rdi, [rel strBuff1]
lea rsi, [rel str3]
call strcat
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrcat4]
call printf
%ENDIF
%IF TEST_tolower
lea rdi, [rel msgTolower]
call puts
lea rdi, [rel strBuff1]
lea rsi, [rel str3]
call strcpy
; TEST: tolower(strBuff1[0])
lea rdi, [rel strBuff1]
call tolower
mov rsi, rax
xor rax, rax
lea rdi, [rel msgTolower1]
call printf
; TEST: tolower() whole strBuff1
lea rdi, [rel strBuff1]
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 msgTolower2]
lea rsi, [rel strBuff1]
call printf
%ENDIF
%IF TEST_toupper
lea rdi, [rel msgToupper]
call puts
lea rdi, [rel strBuff1]
lea rsi, [rel str3]
call strcpy
; TEST: tolupper(strBuff1[0])
lea rdi, [rel strBuff1]
call toupper
mov rsi, rax
xor rax, rax
lea rdi, [rel msgToupper1]
call printf
; TEST: toupper() whole strBuff1
lea rdi, [rel strBuff1]
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 msgTolower2]
lea rsi, [rel strBuff1]
call printf
%ENDIF
%IF TEST_strcmp
lea rdi, [rel msgStrcmp]
call puts
lea rdi, [rel strBuff1]
mov rsi, 32
call strlclr
lea rdi, [rel strBuff1]
lea rsi, [rel str1]
call strcpy
lea rdi, [rel strBuff1+7]
call toupper
mov [strBuff1+7], al
xor rax, rax
lea rdi, [rel msgStrcmpStrs]
lea rsi, [rel str1]
lea rdx, [rel str2]
lea rcx, [rel str4]
lea r8, [rel strBuff1]
call printf
; TEST: strcmp(strbuff1, str1)
lea rdi, [rel strBuff1]
lea rsi, [rel str1]
call strcmp
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrcmp1]
call printf
; TEST: strcmp(str1, str2)
lea rdi, [rel str1]
lea rsi, [rel str2]
call strcmp
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrcmp2]
call printf
; TEST: strcmp(strBuff1, str2)
lea rdi, [rel strBuff1]
lea rsi, [rel str2]
call strcmp
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrcmp3]
call printf
; TEST: strcmp(str4, str1)
lea rdi, [rel str4]
lea rsi, [rel str1]
call strcmp
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrcmp4]
call printf
; TEST: strcmp(str1, str4)
lea rdi, [rel str1]
lea rsi, [rel str4]
call strcmp
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrcmp5]
call printf
; TEST: strcmp(str1, str1)
lea rdi, [rel str1]
mov rsi, rdi
call strcmp
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrcmp6]
call printf
%ENDIF
%IF TEST_file1
lea rdi, [rel msgFileB]
call puts
; TEST: fopen()
lea rdi, [rel testFile1]
mov rsi, 'w'
call fopen
mov r15, rax ;store filepointer to R15
mov rsi, rax
xor rax, rax
lea rdi, [rel msgFileB1]
call printf
; TEST: fwrite()
mov rdi, r15
lea rsi, [fileStr1]
call fwrite
mov rsi, rax
xor rax, rax
lea rdi, [rel msgFileB2]
call printf
; TEST: fclose()
mov rdi, r15
call fclose
mov rsi, rax
xor rax, rax
lea rdi, [rel msgFileB3]
call printf
%ENDIF
leave
ret