862 lines
18 KiB
NASM
862 lines
18 KiB
NASM
;constants.asm
|
|
extern EOS
|
|
extern NL
|
|
;core.asm
|
|
extern min
|
|
extern minu
|
|
extern max
|
|
extern maxu
|
|
extern islower
|
|
extern isupper
|
|
extern tolower
|
|
extern toupper
|
|
extern itoa
|
|
extern exit
|
|
;console.asm
|
|
extern print
|
|
extern puts
|
|
extern printf
|
|
extern perror
|
|
;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_printf equ 1
|
|
TEST_perror 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
|
|
;TEST_itoa equ 0 ; not included in these tests; printf() calls itoa for %d specifiers
|
|
|
|
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
|
|
; printf()
|
|
testStr db "Testing: %s, %%, %s, %s, %f, %s, %d, %s, %s, %x, %s, %s, %d, %s",NL,EOS
|
|
tS1 db "one",EOS
|
|
tS2 db "two",EOS
|
|
tS3 db "three",EOS
|
|
tS4 db "four",EOS
|
|
tS5 db "five",EOS
|
|
tS6 db "six",EOS
|
|
tS7 db "seven",EOS
|
|
tS8 db "eight",EOS
|
|
tS9 db "noin",EOS
|
|
msgPrintf db NL,"# printf()",EOS
|
|
msgPrintf1 db "TEST printf()",NL,EOS
|
|
msgPrintf2 db "TEST printf(testStr, tS1, tS2, tS3, invalid1, tS4, num4, tS5, tS6, invalid2, tS7, tS8, num1, tS9)",NL,EOS
|
|
msgPrintf2b db "Return value: %d",NL,EOS
|
|
; perror()
|
|
msgPerror db NL,"# perror()",EOS
|
|
msgPerror1 db "TEST perror(",34,"ErrTest",34,") (rax=0):",NL,EOS
|
|
msgPerror2 db "TEST perror(",34,"ErrTest",34,") (rax=-22):",NL,EOS
|
|
msgPerror3 db "TEST perror(",34,"ErrTest",34,") (rax=7):",NL,EOS
|
|
perrorStr db "ErrTest",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
|
|
perror_fopen db " Error@fopen()",EOS
|
|
perror_fwrite db " Error@fwrite()",EOS
|
|
perror_fclose db " Error@fclose()",EOS
|
|
section .data
|
|
filePointer1 dq 0
|
|
section .bss
|
|
strBuff1 resb 32
|
|
strBuff2 resb 8
|
|
section .text
|
|
global _start
|
|
_start:
|
|
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_printf
|
|
lea rdi, [rel msgPrintf]
|
|
call puts
|
|
|
|
; TEST: printf(msgPrintf1)
|
|
lea rdi, [rel msgPrintf1]
|
|
call printf
|
|
|
|
; TEST printf(testStr, tS1, tS2, tS3, invalid1, tS4, num4, tS5, tS6, invalid2, tS7, tS8, num1, tS9)
|
|
lea rdi, [rel msgPrintf2]
|
|
call printf
|
|
|
|
lea rdi, [rel testStr]
|
|
lea rsi, [rel tS1]
|
|
lea rdx, [rel tS2]
|
|
lea rcx, [rel tS3]
|
|
mov r8, 0
|
|
lea r9, [rel tS4]
|
|
push tS9
|
|
push qword [rel num1]
|
|
push tS8
|
|
push tS7
|
|
push 0
|
|
push tS6
|
|
push tS5
|
|
push qword [num4]
|
|
call printf
|
|
add rsp, 8*8
|
|
mov rsi, rax
|
|
lea rdi, [msgPrintf2b]
|
|
call printf
|
|
%ENDIF
|
|
%IF TEST_perror
|
|
lea rdi, [rel msgPerror]
|
|
call puts
|
|
|
|
; TEST: perror (no error)
|
|
lea rdi, [rel msgPerror1]
|
|
call print
|
|
xor rax, rax
|
|
lea rdi, [rel perrorStr]
|
|
call perror
|
|
|
|
; TEST: perror (err=-22)
|
|
lea rdi, [rel msgPerror2]
|
|
call print
|
|
mov rax, -22
|
|
lea rdi, [rel perrorStr]
|
|
call perror
|
|
|
|
; TEST: perror (err=7)
|
|
lea rdi, [rel msgPerror3]
|
|
call print
|
|
mov rax, 7
|
|
lea rdi, [rel perrorStr]
|
|
call perror
|
|
%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
|
|
%IF TEST_perror
|
|
lea rdi, [rel perror_fopen]
|
|
call perror
|
|
%ENDIf
|
|
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
|
|
%IF TEST_perror
|
|
lea rdi, [rel perror_fwrite]
|
|
call perror
|
|
%ENDIF
|
|
mov rsi, rax
|
|
xor rax, rax
|
|
lea rdi, [rel msgFileB2]
|
|
call printf
|
|
|
|
; TEST: fclose()
|
|
mov rdi, r15
|
|
call fclose
|
|
%IF TEST_perror
|
|
lea rdi, [rel perror_fclose]
|
|
call perror
|
|
%ENDIF
|
|
mov rsi, rax
|
|
xor rax, rax
|
|
lea rdi, [rel msgFileB3]
|
|
call printf
|
|
%ENDIF
|
|
|
|
leave
|
|
mov rdi, 0
|
|
call exit
|