change labels from global to local in functions, align function calls in stack

This commit is contained in:
2025-08-06 20:10:05 +02:00
parent 2a65c14032
commit caa21a3fb0
11 changed files with 119 additions and 108 deletions

View File

@ -29,7 +29,7 @@ get_char_index:
lea rsi, [rsi + 1]
jne .get_char_index_loop
.error
.error:
mov rax, -1 ;not found and at the end
pop rsi
ret
@ -47,7 +47,7 @@ check_duplicate_char:
mov al ,[rdi] ; test if \0
test al, al
jz no_duplicate
jz .no_duplicate
push rdi
mov rsi, rdi
@ -62,7 +62,7 @@ check_duplicate_char:
mov rax, 1
ret
no_duplicate:
.no_duplicate:
xor rax, rax
ret
@ -76,25 +76,24 @@ check_base:
mov al, [rdi] ; check if it's an empty string
test al, al
jne chk_bs_duplicate
jne .chk_bs_duplicate
xor rax, rax
ret
chk_bs_duplicate:
.chk_bs_duplicate:
push rdi
call check_duplicate_char
pop rdi
test rax, rax
jz chk_bs_char
jz .chk_bs_char
xor rax, rax
ret
chk_bs_char:
.chk_bs_char:
mov al, [rdi] ; if rdi is \0, return 0
test al, al
jz base_ok
jz .base_ok
push rdi ; if current char is in invalid_chars
mov dil, [rdi];
@ -104,12 +103,12 @@ chk_bs_char:
cmp rax, -1 ; if not -1, error
lea rdi, [rdi + 1]
jz chk_bs_char
jz .chk_bs_char
xor rax, rax; return 0
ret
base_ok:
.base_ok:
mov rax,1
ret
@ -120,50 +119,54 @@ base_ok:
ft_atoi_base:
xor rax, rax ;check if there is a null pointer in rdi or rsi
test rdi, rdi
jz return
jz .return
test rsi, rsi
jz return
jz .return
push rdi ; is base valid
push rsi
mov rdi, rsi
sub rsp, 8
call check_base
add rsp, 8
pop rsi
pop rdi
test rax, rax
jne whitespace_skip ; if 0 , base is not valid
jne .whitespace_skip ; if 0 , base is not valid
ret
whitespace_skip_inc:
.whitespace_skip_inc:
lea rdi, [rdi + 1]
whitespace_skip:
.whitespace_skip:
push rdi
push rsi
mov dil, [rdi]
lea rsi, [rel whitespaces]
sub rsp, 8
call get_char_index
add rsp, 8
pop rsi
pop rdi
cmp rax, 0
jge whitespace_skip_inc
jge .whitespace_skip_inc
xor rdx, rdx
jmp plus_minus
jmp .plus_minus
plus_minus_invert:
.plus_minus_invert:
xor rdx, 1
plus_minus_inc:
.plus_minus_inc:
lea rdi, [rdi + 1]
plus_minus:
.plus_minus:
mov al, [rdi]
cmp al, '-'
jz plus_minus_invert
jz .plus_minus_invert
cmp al, '+'
jz plus_minus_inc
jz .plus_minus_inc
push rdx ; keep invert sign setting in stack
@ -179,16 +182,18 @@ plus_minus:
xor rax, rax
number_loop:
.number_loop:
mov dl, [rdi]
test dl, dl
jz final_number
jz .final_number
push rax
push rdi
push rsi
mov dil, dl
sub rsp, 8
call get_char_index
add rsp, 8
pop rsi
pop rdi
@ -196,7 +201,7 @@ number_loop:
pop rax
cmp rdx, -1 ; if the char is not in the base, return the number
jz final_number
jz .final_number
push rdx ; imul sets rdx to 0
imul rbx
@ -205,15 +210,15 @@ number_loop:
lea rdi, [rdi + 1]
jmp number_loop
jmp .number_loop
final_number:
.final_number:
pop rdx
test rdx, rdx
jne neg_final_number
jne .neg_final_number
ret
neg_final_number:
.neg_final_number:
neg rax
return:
.return:
ret

View File

@ -5,19 +5,19 @@ section .text
ft_list_push_front:
test rdi, rdi
jz err
jz .err
push rdi
push rsi
sub rsp, 8
mov rdi, 16
sub rsp, 8
call malloc wrt ..plt
add rsp, 8
pop rsi
pop rdi
test rax, rax ; did malloc return 0
jz err
jz .err
push rdi
mov rdi, [rdi]
@ -27,5 +27,5 @@ ft_list_push_front:
mov [rdi], rax
err:
.err:
ret

View File

@ -57,18 +57,18 @@ call_free_elem:
ft_list_remove_if:
test rdi, rdi
jz end
jz .end
test rdx, rdx
jz end
jz .end
test rcx, rcx
jz end
jz .end
xor r8, r8
mov rax, [rdi]
loop:
.loop:
test rax, rax
jz end
jz .end
push rax
push rdi
@ -89,20 +89,20 @@ loop:
pop rsi
pop rdi
jnz loop_end ;if call to rdx returned zero, don't remove
jnz .loop_end ;if call to rdx returned zero, don't remove
pop rax
sub rsp, 8
call remove_element
add rsp, 8
jmp loop
jmp .loop
loop_end:
.loop_end:
pop rax
mov r8, rax
mov rax, [rax + 8]
jmp loop
jmp .loop
end:
.end:
ret

View File

@ -5,15 +5,14 @@ section .text
ft_list_size:
xor rax, rax
count_start:
.count_start:
test rdi, rdi
jz end
jz .end
mov rdi, [rdi + 8]
inc rax
lea rax, [rax + 1]
jmp .count_start
jmp count_start
end:
.end:
ret

View File

@ -19,37 +19,37 @@ list_swap:
ft_list_sort:
test rdi, rdi
jz err
jz .err
test rsi, rsi
jz err
jz .err
mov rdi, [rdi]
push rdi
call ft_list_size
pop rdi
loop:
.loop:
test rax, rax
jz err
jz .err
push rax
push rdi
push rsi
mov rax, rsi ; move cmp to rax
jmp loop2
jmp .loop2
loop2_inc:
.loop2_inc:
mov rdi, [rdi + 8]
loop2:
.loop2:
test rdi, rdi
jz loop2_end
jz .loop2_end
mov rsi, [rdi + 8]
test rsi, rsi
jz loop2_end
jz .loop2_end
push rdi
mov rdi, [rdi]
@ -61,24 +61,23 @@ loop2:
cmp eax, 0
pop rax
pop rdi
jle loop2_inc
jle .loop2_inc
; then call list_swap
mov rsi, [rdi + 8]
push rax
sub rsp, 8
call list_swap
add rsp, 8
pop rax
jmp loop2_inc
jmp .loop2_inc
loop2_end:
.loop2_end:
pop rsi
pop rdi
pop rax
lea rax, [rax - 1]
jmp loop
jmp .loop
err:
.err:
ret

View File

@ -7,13 +7,15 @@ ft_read:
syscall
cmp rax, 0 ; if return is < 0, it's an error in negative
jge success
jge .success
neg rax ; inv errno, and set errno
mov edi, eax
sub rsp, 8
call __errno_location wrt ..plt
add rsp, 8
mov [rax], edi
mov rax, -1
success:
.success:
ret

View File

@ -5,44 +5,43 @@ ft_strcmp:
xor rax, rax
test rdi, rdi ; test if args are false
jz err
jz .err
test rsi, rsi
jz err
loop_start:
jz .err
.loop_start:
mov al, [rdi]
cmp al, [rsi]
jne compare
jne .compare
test al, al ; test if rdi is \0
jz compare
jz .compare
mov al, [rsi] ; test if rsi is \0
test al, al
jz compare
jz .compare
lea rsi, [rsi + 1]
lea rdi, [rdi + 1]
jmp loop_start
jmp .loop_start
compare:
.compare:
mov al, [rdi]
cmp al, [rsi]
jl lower
jg greater
jl .lower
jg .greater
mov eax, 0
jmp end
jmp .end
lower:
.lower:
mov eax, -1
jmp end
jmp .end
greater:
.greater:
mov eax, 1
jmp end
jmp .end
err:
.err:
mov eax, 0
end:
.end:
ret

View File

@ -3,25 +3,25 @@ section .text
ft_strcpy:
test rdi, rdi
jz err
jz .err
test rsi, rsi
jz err
jz .err
push rdi
loop_start:
.loop_start:
mov al, [rsi]
mov [rdi],al
lea rdi, [rdi + 1]
lea rsi, [rsi + 1]
test al, al
jne loop_start
jne .loop_start
end:
.end:
pop rax
ret
err:
.err:
xor rax, rax
ret

View File

@ -1,5 +1,6 @@
extern malloc
global ft_strdup
extern malloc
extern ft_strcpy
extern ft_strlen
extern __errno_location
@ -7,7 +8,7 @@ section .text
ft_strdup:
test rdi, rdi ; test if arg is NULL
jz err
jz .err
push rdi ;push to use it for the strcpy
call ft_strlen
@ -16,17 +17,21 @@ ft_strdup:
call malloc wrt ..plt
test rax, rax
jz malloc_failed
jz .malloc_failed
mov rdi, rax
pop rsi
sub rsp, 8
call ft_strcpy
add rsp, 8
ret
malloc_failed:
.malloc_failed:
sub rsp, 8
call __errno_location wrt ..plt
add rsp, 8
mov dword [rax], 12
pop rax
err:
.err:
xor rax, rax
ret

View File

@ -3,22 +3,22 @@ section .text
ft_strlen:
test rdi, rdi
jz err
jz .err
mov rsi, rdi
jmp loop_start
jmp .loop_start
increase_pointer:
.increase_pointer:
lea rsi, [rsi + 1]
loop_start:
.loop_start:
mov al, [rsi]
test al, al
jnz increase_pointer
end:
jnz .increase_pointer
.end:
sub rsi, rdi
mov rax, rsi
ret
err:
.err:
xor rax, rax
ret

View File

@ -7,14 +7,16 @@ ft_write:
syscall
cmp rax, 0 ; if return is < 0, it's an error in negative
jge success
jge .success
neg rax ; inv errno, and set errno
mov edi, eax
sub rsp, 8
call __errno_location wrt ..plt
add rsp, 8
mov [rax], edi
mov rax, -1
success:
.success:
ret