Почему код выдает ошибку сегментации?
Я пишу свой компилятор. Временные переменные, локальные переменные и параметры функции хочу передавать через стек. Почему в сгенерированном коде возникает ошибка сегментации?
section .data
правда db 1
ложь db 0
раз dd 12
global main
section .text
function_return:
push rbp
mov rbp, rsp
sub rsp, 56
mov RCX, 1
cmp RCX, 0
je L1
sub rsp, 8
mov ECX, [rbp+16]
mov RBX, 12
mov RAX, RCX
add RAX, RBX
mov RCX, RAX
add RCX, RBX
mov RAX, RCX
leave
ret
add rsp, 8
jmp L0
L1:
mov RCX, 0
cmp RCX, 0
je L2
add rsp, 8
mov RCX, 20
mov RAX, RCX
leave
ret
sub rsp, 8
jmp L0
L2:
add rsp, 8
mov RCX, 10
mov RAX, RCX
leave
ret
L0:
sub rsp, 8
mov RCX, 22
mov RAX, RCX
leave
ret
main:
push rbp
mov rbp, rsp
sub rsp, 80
mov RCX, 2
mov [rbp-16], RCX
L3:
mov ECX, [rbp-16]
mov RBX, 5
cmp RCX, RBX
je L6
mov RCX, 0
sub rsp, 8
mov [rbp-88], RCX
jmp L7
L6:
add rsp, 8
mov RCX, 1
mov [rbp-88], RCX
L7:
mov RCX, [rbp-88]
cmp RCX, 0
je L4
mov ECX, [rbp-16]
mov RBX, 4
mov RAX, RCX
add RAX, RBX
mov RDX, 2
mov RCX, RAX
add RCX, RDX
mov [rbp-24], RCX
mov ECX, [rbp-24]
push RCX
call function_return
add rsp, 8
L5:
mov ECX, [rbp-16]
mov RBX, 1
mov RAX, RCX
add RAX, RBX
mov [rbp-16], RAX
jmp L3
L4:
mov rax, 60
syscall
Были попытки убрать некоторые смещения, а также увеличить смещение.