Rewrite tests (most accidentally done in previous commit), add TODO (bugfix) in strcmp()
This commit is contained in:
@ -98,6 +98,7 @@ strcat:
|
|||||||
;----- strcmp(char* str1, char* str2) -----;
|
;----- strcmp(char* str1, char* str2) -----;
|
||||||
; return value: 0 if both strings are the same, otherwise index in array str1 where strings are to become different
|
; return value: 0 if both strings are the same, otherwise index in array str1 where strings are to become different
|
||||||
; returns -1 if str2 is longer than str1 and no difference was found before that happens
|
; returns -1 if str2 is longer than str1 and no difference was found before that happens
|
||||||
|
; TODO: FIX length 13 for TEST strcmp(strBuff1, str1) (see tests.asm, test 1)
|
||||||
strcmp:
|
strcmp:
|
||||||
push rbp
|
push rbp
|
||||||
mov rbp, rsp
|
mov rbp, rsp
|
||||||
|
141
tests.asm
141
tests.asm
@ -56,13 +56,13 @@ section .rodata
|
|||||||
prntStrs db "PRINT strings:",NL,"> str1: %s",NL,"> str2: %s",NL,"> str3: %s",NL,"> str4: %s",NL,EOS
|
prntStrs db "PRINT strings:",NL,"> str1: %s",NL,"> str2: %s",NL,"> str3: %s",NL,"> str4: %s",NL,EOS
|
||||||
|
|
||||||
; print()
|
; print()
|
||||||
msgPrint db "# print()",NL,EOS
|
msgPrint db NL,"# print()",NL,EOS
|
||||||
msgPrint1 db "print() test",EOS
|
msgPrint1 db "print() test",EOS
|
||||||
; puts()
|
; puts()
|
||||||
msgPuts db NL,"# puts()",NL,EOS
|
msgPuts db NL,NL,"# puts()",NL,EOS
|
||||||
msgPuts1 db "puts() test",EOS
|
msgPuts1 db "puts() test",EOS
|
||||||
; min() / minu()
|
; min() / minu()
|
||||||
msgMin db "# 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
|
||||||
msgMin2 db "TEST minu(num1, num2): %d",NL,EOS
|
msgMin2 db "TEST minu(num1, num2): %d",NL,EOS
|
||||||
msgMin3 db "TEST min(num1, num3): %d",NL,EOS
|
msgMin3 db "TEST min(num1, num3): %d",NL,EOS
|
||||||
@ -72,7 +72,7 @@ section .rodata
|
|||||||
msgMin7 db "TEST min(num2, num4): %d",NL,EOS
|
msgMin7 db "TEST min(num2, num4): %d",NL,EOS
|
||||||
msgMin8 db "TEST minu(num2, num4): %d",NL,EOS
|
msgMin8 db "TEST minu(num2, num4): %d",NL,EOS
|
||||||
; max() / maxu()
|
; max() / maxu()
|
||||||
msgMax db "# max() / maxu()",EOS
|
msgMax db NL,"# max() / maxu()",EOS
|
||||||
msgMax1 db "TEST max(num1, num2): %d",NL,EOS
|
msgMax1 db "TEST max(num1, num2): %d",NL,EOS
|
||||||
msgMax2 db "TEST maxu(num1, num2): %d",NL,EOS
|
msgMax2 db "TEST maxu(num1, num2): %d",NL,EOS
|
||||||
msgMax3 db "TEST max(num1, num3): %d",NL,EOS
|
msgMax3 db "TEST max(num1, num3): %d",NL,EOS
|
||||||
@ -82,54 +82,63 @@ section .rodata
|
|||||||
msgMax7 db "TEST max(num2, num4): %d",NL,EOS
|
msgMax7 db "TEST max(num2, num4): %d",NL,EOS
|
||||||
msgMax8 db "TEST maxu(num2, num4): %d",NL,EOS
|
msgMax8 db "TEST maxu(num2, num4): %d",NL,EOS
|
||||||
; strlen()
|
; strlen()
|
||||||
msgStrlen db "# strlen()",EOS
|
msgStrlen db NL,"# strlen()",EOS
|
||||||
msgStrlen1 db "TEST strlen(str1): %d",NL,EOS
|
msgStrlen1 db "TEST strlen(str1): %d",NL,EOS
|
||||||
msgStrlen2 db "TEST strlen(str2): %d",NL,EOS
|
msgStrlen2 db "TEST strlen(str2): %d",NL,EOS
|
||||||
msgStrlen3 db "TEST strlen(str3): %d",NL,EOS
|
msgStrlen3 db "TEST strlen(str3): %d",NL,EOS
|
||||||
msgStrlen4 db "TEST strlen(str4): %d",NL,EOS
|
msgStrlen4 db "TEST strlen(str4): %d",NL,EOS
|
||||||
; islower()
|
; islower()
|
||||||
msgIslower db "# islower()",EOS
|
msgIslower db NL,"# islower()",EOS
|
||||||
msgIslower1 db "TEST islower(str1[0]): %d",NL,EOS ;str1[0] => 'H'
|
msgIslower1 db "TEST islower(str1[0]): %d",NL,EOS ;str1[0] => 'H'
|
||||||
msgIslower2 db "TEST islower(str1[1]): %d",NL,EOS ;str1[1] => 'e'
|
msgIslower2 db "TEST islower(str1[1]): %d",NL,EOS ;str1[1] => 'e'
|
||||||
msgIslower3 db "TEST islower(str1[5]): %d",NL,EOS ;str1[5] => ','
|
msgIslower3 db "TEST islower(str1[5]): %d",NL,EOS ;str1[5] => ','
|
||||||
; isupper()
|
; isupper()
|
||||||
msgIsupper db "# isupper()",EOS
|
msgIsupper db NL,"# isupper()",EOS
|
||||||
msgIsupper1 db "TEST isupper(str1[0]): %d",NL,EOS ;str1[0] => 'H'
|
msgIsupper1 db "TEST isupper(str1[0]): %d",NL,EOS ;str1[0] => 'H'
|
||||||
msgIsupper2 db "TEST isupper(str1[1]): %d",NL,EOS ;str1[1] => 'e'
|
msgIsupper2 db "TEST isupper(str1[1]): %d",NL,EOS ;str1[1] => 'e'
|
||||||
msgIsupper3 db "TEST isupper(str1[5]): %d",NL,EOS ;str1[5] => ','
|
msgIsupper3 db "TEST isupper(str1[5]): %d",NL,EOS ;str1[5] => ','
|
||||||
; strcpy()
|
; strcpy()
|
||||||
msgStrcpy db "# strcpy()",EOS
|
msgStrcpy db NL,"# strcpy()",EOS
|
||||||
msgStrcpy1 db "TEST strcpy(strBuff1, str4): %s",NL,EOS
|
msgStrcpy1 db "TEST strcpy(strBuff1, str4): %s",NL,EOS
|
||||||
msgStrcpy2 db "TEST strcpy(strBuff1, str2): %s",NL,EOS
|
msgStrcpy2 db "TEST strcpy(strBuff1, str2): %s",NL,EOS
|
||||||
msgStrcpy3 db "TEST strcpy(strBuff1, str1): %s",NL,EOS
|
msgStrcpy3 db "TEST strcpy(strBuff1, str1): %s",NL,EOS
|
||||||
; strlcpy()
|
; strlcpy()
|
||||||
msgStrlcpy db "# strlcpy()",EOS
|
msgStrlcpy db NL,"# strlcpy()",EOS
|
||||||
msgStrlcpy1 db "TEST strlcpy(strBuff2, str1, -1) (%d): %s",NL,EOS
|
msgStrlcpy1 db "TEST strlcpy(strBuff2, str1, -1) (%d): %s",NL,EOS
|
||||||
msgStrlcpy2 db "TEST strlcpy(strBuff2, str1, 0) (%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
|
msgStrlcpy3 db "TEST strlcpy(strBuff2, str1, 5) (%d): %s",NL,EOS
|
||||||
msgStrlcpy4 db "TEST strlcpy(strBuff2, str4, 8) (%d): %s",NL,EOS
|
msgStrlcpy4 db "TEST strlcpy(strBuff2, str4, 8) (%d): %s",NL,EOS
|
||||||
; strclr()
|
; strclr()
|
||||||
msgStrclr db "# strclr()",EOS
|
msgStrclr db NL,"# strclr()",EOS
|
||||||
msgStrclr1 db "TEST strclr(strBuff1): (%d) %s",NL,EOS
|
msgStrclr1 db "TEST strclr(strBuff1): (%d) %s",NL,EOS
|
||||||
msgStrclr2 db "> strcpy(strBuff1, str3). strBuff1 => %s",NL,EOS
|
msgStrclr2 db "> strcpy(strBuff1, str3). strBuff1 => %s",NL,EOS
|
||||||
msgStrclr3 db "TEST strclr(strBuff1): (%d) %s",NL,EOS
|
msgStrclr3 db "TEST strclr(strBuff1): (%d) %s",NL,EOS
|
||||||
; strlclr()
|
; strlclr()
|
||||||
msgStrlclr db "# strlclr()",EOS
|
msgStrlclr db NL,"# strlclr()",EOS
|
||||||
msgStrlclr1 db "TEST strlclr(strbuff1, 32): %s",NL,EOS
|
msgStrlclr1 db "TEST strlclr(strbuff1, 32): %s",NL,EOS
|
||||||
msgStrlclr2 db "> strcpy(strBuff1, str3). strBuff1 => %s",NL,EOS
|
msgStrlclr2 db "> strcpy(strBuff1, str3). strBuff1 => %s",NL,EOS
|
||||||
msgStrlclr3 db "TEST strlclr(strBuff1, 32): %s",NL,EOS
|
msgStrlclr3 db "TEST strlclr(strBuff1, 32): %s",NL,EOS
|
||||||
; strcat()
|
; strcat()
|
||||||
msgStrcat db "# strcat()",EOS
|
msgStrcat db NL,"# strcat()",EOS
|
||||||
msgStrcat1 db "TEST strcat(strBuff1, str3): %s", NL,EOS
|
msgStrcat1 db "TEST strcat(strBuff1, str3): %s", NL,EOS
|
||||||
msgStrcat2 db "> strclr(strBuff1)",EOS
|
msgStrcat2 db "> strclr(strBuff1)",EOS
|
||||||
msgStrcat3 db "TEST strcat(strBuff1, str1): %s",NL,EOS
|
msgStrcat3 db "TEST strcat(strBuff1, str1): %s",NL,EOS
|
||||||
msgStrcat4 db "TEST strcat(strBuff1, str3): %s",NL,EOS
|
msgStrcat4 db "TEST strcat(strBuff1, str3): %s",NL,EOS
|
||||||
; tolower()
|
; tolower()
|
||||||
msgTolower db "# tolower()",NL,"> strcpy(strBuff1, str3)",EOS
|
msgTolower db NL,"# tolower()",NL,"> strcpy(strBuff1, str3)",EOS
|
||||||
msgTolower1 db "TEST tolower(strBuff1[0]): %c",NL,EOS
|
msgTolower1 db "TEST tolower(strBuff1[0]): %c",NL,EOS
|
||||||
msgTolower2 db "TEST tolower for whole strBuff1: %s",NL,EOS
|
msgTolower2 db "TEST tolower for whole strBuff1: %s",NL,EOS
|
||||||
; toupper()
|
; 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()
|
; strcmp()
|
||||||
|
msgStrcmp db NL,"# strcmp()",NL,"> strlclr(strBuff1, 32)",NL,"> strcpy(strBuff1, str1)",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(strBuff1, str2): %d",NL,EOS
|
||||||
|
msgStrcmp3 db "TEST strcmp(str4, str1): %d",NL,EOS
|
||||||
|
msgStrcmp4 db "TEST strcmp(str1, str4): %d",NL,EOS
|
||||||
section .bss
|
section .bss
|
||||||
strBuff1 resb 32
|
strBuff1 resb 32
|
||||||
strBuff2 resb 8
|
strBuff2 resb 8
|
||||||
@ -566,6 +575,7 @@ main:
|
|||||||
|
|
||||||
lea rdi, [rel strBuff1]
|
lea rdi, [rel strBuff1]
|
||||||
lea rsi, [rel str3]
|
lea rsi, [rel str3]
|
||||||
|
call strcpy
|
||||||
|
|
||||||
; TEST: tolower(strBuff1[0])
|
; TEST: tolower(strBuff1[0])
|
||||||
lea rdi, [rel strBuff1]
|
lea rdi, [rel strBuff1]
|
||||||
@ -576,9 +586,110 @@ main:
|
|||||||
call printf
|
call printf
|
||||||
|
|
||||||
; TEST: tolower() whole strBuff1
|
; TEST: tolower() whole strBuff1
|
||||||
;lea rdi, [rel strBuff1]
|
lea rdi, [rel strBuff1]
|
||||||
;.tolowerLoop:
|
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
|
||||||
|
|
||||||
|
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(strBuff1, str2)
|
||||||
|
lea rdi, [rel strBuff1]
|
||||||
|
lea rsi, [rel str2]
|
||||||
|
call strcmp
|
||||||
|
mov rsi, rax
|
||||||
|
xor rax, rax
|
||||||
|
lea rdi, [rel msgStrcmp2]
|
||||||
|
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 msgStrcmp3]
|
||||||
|
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 msgStrcmp4]
|
||||||
|
call printf
|
||||||
%ENDIF
|
%ENDIF
|
||||||
|
|
||||||
leave
|
leave
|
||||||
|
Reference in New Issue
Block a user