Files
klibc/tests.asm

278 lines
4.9 KiB
NASM

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
msgTolower2 db "tolower(str1[1]): %c",10,0
msgTolower3 db "tolower() for whole str1Copy: %s",10,0
msgToupper db "toupper(str1[0]): %c",10,0
msgToupper2 db "toupper(str1[1]): %c",10,0
msgToupper3 db "toupper() for whole str1Copy: %s",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
; ...str1[1]
lea rdi, [rel str1+1]
call tolower
mov rsi, rax
xor rax, rax
lea rdi, [rel msgTolower2]
call printf
; 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
; TEST: tolower: entire str1Copy
lea rdi, [rel str1Copy]
call strlen
mov rcx, rax
.tolowerLoop:
movzx r10, byte [rdi]
mov byte [rdi], r10b
push rcx
sub rsp, 8
call tolower
add rsp, 8
pop rcx
mov byte [rdi], al
inc rdi
inc r10
loop .tolowerLoop
xor rax, rax
lea rdi, [rel msgTolower3]
lea rsi, [rel str1Copy]
call printf
; TEST: toupper: entire str1Copy
lea rdi, [rel str1Copy]
call strlen
mov rcx, rax
.toupperLoop:
movzx r10, byte [rdi]
mov byte [rdi], r10b
push rcx
sub rsp, 8
call toupper
add rsp, 8
pop rcx
mov byte [rdi], al
inc rdi
inc r10
loop .toupperLoop
xor rax, rax
lea rdi, [rel msgToupper3]
lea rsi, [rel str1Copy]
call printf
leave
ret