Почему код выдает ошибку сегментации?

Я пишу свой компилятор. Временные переменные, локальные переменные и параметры функции хочу передавать через стек. Почему в сгенерированном коде возникает ошибка сегментации?

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

Были попытки убрать некоторые смещения, а также увеличить смещение.


Ответы (0 шт):