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