min[u](),max[u](),islower(),isupper(),print(),puts(),strlen(),strcpy(),strcat()

This commit is contained in:
2025-06-23 15:07:55 +02:00
parent 4820e6242f
commit 2f5e3202db
4 changed files with 407 additions and 0 deletions

46
console.asm Normal file
View File

@ -0,0 +1,46 @@
extern strlen
section .rodata
NL db 10
section .text
global print
global puts
;----- print (char* string) -----;
; return value: N/A
print:
push rbp
mov rbp, rsp
push rdi
sub rsp, 8
call strlen
mov rdx, rax
add rsp, 8
pop rdi
mov rax, 1
mov rsi, rdi
mov rdi, 1
syscall
leave
ret
;----- puts (char* string) -----;
; return value: N/A
puts:
push rbp
mov rbp, rsp
push rdi
sub rsp, 8
call print
add rsp, 8
pop rdi
mov rax, 1
mov rdi, 1
mov rsi, NL
mov rdx, 1
syscall
leave
ret

96
core.asm Normal file
View File

@ -0,0 +1,96 @@
section .text
global min
global minu
global max
global maxu
global islower
global isupper
;----- min(int a, int b) -----;
; return value: lowest value
min:
push rbp
mov rbp, rsp
mov rax, rdi
cmp rdi, rsi
jl .quit
mov rax, rsi
.quit:
leave
ret
;----- minu(unsigned int a, unsigned int b) -----;
; return value: lowest value
minu:
push rbp
mov rbp, rsp
mov rax, rdi
cmp rdi, rsi
jb .quit
mov rax, rsi
.quit:
leave
ret
;----- max(int a, int b) -----;
; return value: highest value
max:
push rbp
mov rbp, rsp
mov rax, rdi
cmp rdi, rsi
jg .quit
mov rax, rsi
.quit:
leave
ret
;----- maxu(unsigned int a, unsigned int b) -----;
; return value: highest value
maxu:
push rbp
mov rbp, rsp
mov rax, rdi
cmp rdi, rsi
ja .quit
mov rax, rsi
.quit:
leave
ret
;----- islower(char* c) -----;
; return value: 1 (character is in range of 'a'-'z') or 0 (character is nog in range of 'a'-'z')
islower:
push rbp
mov rbp, rsp
xor rax, rax
cmp byte [rdi], 'a'
jb .quit
cmp byte [rdi], 'z'
ja .quit
mov rax, 1
.quit:
leave
ret
;----- isupper(char* c) -----;
; return value: 1 (character is in range of 'A'-'Z') or 0 (character is not in range of 'A'-'Z')
isupper:
push rbp
mov rbp, rsp
xor rax, rax
cmp byte [rdi], 'A'
jb .quit
cmp byte [rdi], 'Z'
ja .quit
mov rax, 1
.quit:
leave
ret

67
string.asm Normal file
View File

@ -0,0 +1,67 @@
section .text
global strlen
global strcpy
global strcat
;----- strlen(char* str) -----;
; return value: amount of characters before EOS was found
strlen:
push rbp
mov rbp, rsp
xor rax, rax
.findEOS:
cmp byte [rdi+rax], 0x0
je .quit
inc rax
jmp .findEOS
.quit:
leave
ret
;----- strcpy(char* dest, char* src) -----;
; return value: pointer to dest or NULL if nothing was copied
strcpy:
push rbp
mov rbp, rsp
push rdi
sub rsp, 8
xor rax, rax
xor rcx, rcx
.loop:
cmp byte [rsi], 0x0
je .0f
mov r10b, byte [rsi]
mov byte [rdi], r10b
inc rsi
inc rdi
inc rcx
jmp .loop
.0f:
pop rax
add rsp, 8
cmp rcx, 0
jne .quit
xor rax, rax
.quit:
leave
ret
;----- strcat(char* dest, char* src) -----;
; return value: pointer to dest
strcat:
push rbp
mov rbp, rsp
push rdi
sub rsp, 8
call strlen
add rdi, rax
call strcpy
add rsp, 8
pop rdi
leave
ret

198
tests.asm Normal file
View File

@ -0,0 +1,198 @@
extern printf
;core.asm
extern min
extern minu
extern max
extern maxu
extern islower
extern isupper
;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
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
leave
ret