385 lines
7.2 KiB
NASM
385 lines
7.2 KiB
NASM
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
|