186 lines
2.6 KiB
NASM
186 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 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
|
|
leave
|
|
ret
|
|
;----- exit(int exit_code) -----;
|
|
; returns: nothing
|
|
exit:
|
|
mov rax, NR_exit
|
|
syscall
|