278 lines
4.9 KiB
NASM
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
|