extern printf ;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 strcat section .rodata num1 dq 13 num2 dq -25 num3 equ 60 msgNums db "> num1: %d",10,"> num2: %d",10,"> num3: %d",10,0 msgMin db "min(num1, num2): %d",10,0 msgMin2 db "minu(num1, num3): %d",10,0 msgMin3 db "min(num2, num3): %d",10,0 msgMax db "max(num1, num2): %d",10,0 msgMax2 db "maxu(num1, num3): %d",10,0 msgMax3 db "max(num2, num3): %d",10,0 msgPrint db "print() test",0 msgPuts db " and puts() test",0 str1 db "Hello, world!",0 str2 db "Hello World!",0 str3 db "Howdy environment!",0 msgStrings db "> str1: %s",10,"> str2: %s",10,"> str3: %s",10,0 msgStrlen db "strlen(str1): %d",10,0 msgStrlen2 db "strlen(str3): %d",10,0 msgIslower db "islower(str1[0]): %d",10,0 msgIslower2 db "islower(str1[1]): %d",10,0 msgIsupper db "isupper(str1[0]): %d",10,0 msgIsupper2 db "isupper(str1[1]): %d",10,0 msgStrcpy db "strcpy(str1Copy, str1): %s",10,0 msgStrcat db "strcat(str1Copy, str3): %s",10,0 msgStrlen3 db "strlen(str1Copy): %d",10,0 msgTolower db "tolower(str1[0]): %c",10,0 msgToupper db "toupper(str1[1]): %c",10,0 section .data section .bss str1Copy resb 32 section .text global main main: push rbp mov rbp, rsp ; PRINT: num1, num2, num3 xor rax, rax lea rdi, [rel msgNums] mov rsi, [rel num1] mov rdx, [rel num2] mov rcx, num3 call printf ; 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 ; 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 ; TEST: print() lea rdi, [rel msgPrint] call print ; TEST: puts() lea rdi, [rel msgPuts] call puts ; 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 ; 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 ; 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 ; 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 ; TEST: strcpy() lea rdi, [rel str1Copy] lea rsi, [rel str1] call strcpy xor rax, rax lea rdi, [rel msgStrcpy] lea rsi, [rel str1Copy] call printf ; TEST: strcat() lea rdi, [rel str1Copy] lea rsi, [rel str3] call strcat xor rax, rax lea rdi, [rel msgStrcat] lea rsi, [rel str1Copy] call printf ; TEST: strlen() for str1Copy lea rdi, [rel str1Copy] call strlen mov rsi, rax xor rax, rax lea rdi, [rel msgStrlen3] call printf ; TEST: tolower(str1[0]) lea rdi, [rel str1] call tolower mov rsi, rax xor rax, rax lea rdi, [rel msgTolower] call printf ; TEST: toupper(str1[1]) lea rdi, [rel str1+1] call toupper mov rsi, rax xor rax, rax lea rdi, [rel msgToupper] call printf leave ret