Files
klibc/core.asm
2025-06-25 16:23:02 +02:00

188 lines
2.6 KiB
NASM

extern NR_exit
extern strclr
section .text
global min
global minu
global max
global maxu
global islower
global isupper
global tolower
global toupper
global itoa
global exit
;----- min(int a, int b) -----;
; return value: lowest value
min:
push rbp
mov rbp, rsp
mov rax, rdi
cmp rdi, rsi
cmovg rax, rsi
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
cmova rax, rsi
leave
ret
;----- max(int a, int b) -----;
; return value: highest value
max:
push rbp
mov rbp, rsp
mov rax, rdi
cmp rdi, rsi
cmovl rax, rsi
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
cmovb rax, rsi
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
;----- tolower(char* c) -----;
; return value: ASCII value. Same as original if it was not an uppercase letter, otherwise lowercase letter
tolower:
push rbp
mov rbp, rsp
call isupper
mov rcx, rax
mov al, byte [rdi]
cmp rcx, 1
jne .quit
add al, 32
.quit:
leave
ret
;----- toupper(char* c) -----;
; return value: ASCII value. Same as original if it was not a lowercase letter, otherwise uppercase letter
toupper:
push rbp
mov rbp, rsp
call islower
mov rcx, rax
mov al, byte [rdi]
cmp rcx, 1
jne .quit
sub al, 32
.quit:
leave
ret
;----- itoa(int num, char* str) -----;
; return value: pointer to str
itoa:
push rbp
mov rbp, rsp
push rbx
push rsi
push rdi
mov rdi, rsi
call strclr
pop rdi
mov rax, rdi
mov r8, rsi
xor rcx, rcx
test rax, rax
jnz .checkNeg
mov byte [rsi], '0'
mov byte [rsi+1], 0
jmp .quit
.checkNeg:
xor rbx, rbx
test rax, rax
jns .convert
neg rax
mov rbx, 1
.convert:
xor rdx, rdx
mov r10, 10
div r10
add rdx, '0'
push rdx
inc rcx
test rax, rax
jnz .convert
test rbx, rbx
jz .toString
push byte '-'
inc rcx
.toString:
pop rdx
mov byte [rsi], dl
inc rsi
loop .toString
mov byte [rsi], 0
.quit:
pop rax
pop rbx
leave
ret
;----- exit(int exit_code) -----;
; returns: nothing
exit:
mov rax, NR_exit
syscall