Adds strclr() and strlclr()

This commit is contained in:
2025-06-24 18:29:18 +02:00
parent 46051d0082
commit e2de729a87
2 changed files with 440 additions and 205 deletions

611
tests.asm
View File

@ -19,67 +19,120 @@ extern puts
extern strlen
extern strcpy
extern strlcpy
extern strclr
extern strlclr
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_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
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
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
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
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 "# print()",NL,EOS
msgPrint1 db "print() test",EOS
; puts()
msgPuts db NL,"# puts()",NL,EOS
msgPuts1 db "puts() test",EOS
; min() / minu()
msgMin db "# 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 "# 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 "# 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 "# 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 "# 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 "# 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 "# 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 "# 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 "# 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 "# 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 "# 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()
; strcmp()
section .bss
strBuff1 resb 32
strBuff2 resb 8
section .text
global main
main:
@ -87,144 +140,293 @@ main:
mov rbp, rsp
%IF PRINT_nums
; PRINT: num1, num2, num3
xor rax, rax
lea rdi, [rel msgNums]
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
; 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 msgMin]
lea rdi, [rel msgMin1]
call printf
;
;TEST: minu(num1, num2)
mov rdi, [rel num1]
mov rsi, num3
mov rsi, [rel num2]
call minu
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMin2]
call printf
;
mov rdi, [rel num2]
;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
; 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 msgMax]
lea rdi, [rel msgMax1]
call printf
;
;TEST: maxu(num1, num2)
mov rdi, [rel num1]
mov rsi, num3
mov rsi, [rel num2]
call maxu
mov rsi, rax
xor rax, rax
lea rdi, [rel msgMax2]
call printf
;
mov rdi, [rel num2]
;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
%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
;TEST: maxu(num1, num3)
mov rdi, [rel num1]
mov rsi, num3
call maxu
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrings]
lea rsi, [rel str1]
lea rdx, [rel str2]
lea rcx, [rel str3]
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
; 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 msgStrlen]
lea rdi, [rel msgStrlen1]
call printf
;
lea rdi, [rel str3]
; 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
; 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 msgIslower]
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
; 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 msgIsupper]
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
; TEST: strcpy()
lea rdi, [rel strBuff]
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 msgStrcpy]
lea rsi, [rel strBuff]
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]
@ -232,7 +434,7 @@ main:
call strlcpy
mov rsi, rax
xor rax, rax
lea rdi, [rel msgStrlcpy]
lea rdi, [rel msgStrlcpy1]
lea rdx, [rel strBuff2]
call printf
; TEST: strlcpy(strBuff2, str1, 0)
@ -255,130 +457,129 @@ main:
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_strcat
; TEST: strcat()
lea rdi, [rel strBuff]
%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 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]
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]
; 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]
;.tolowerLoop:
%ENDIF
leave
ret