NASM: Invalid memory reference (SIGSEGV) - Assembler

Узнай цену своей работы

Формулировка задачи:

Всем привет. Изучаю ассемблер, пользуюсь NASM. Подскажите нубасу, что не так в коде? Я вот что-то не могу найти "не валидную ссылку на память". Что не так? Спасибо.
global _start
section .text
_start:
    xor rax, rax
    
    push qword 256
    push qword 0
    push array
    call fill
    sub rsp, 24
    ret
    
fill:
    ; create stack frame
    push rbp
    mov rbp, rsp
    sub rsp, 24
    
    ; save data of using registers
    mov [rbp-8],  rax
    mov [rbp-16], rcx
    mov [rbp-24], rdi
    
    ; check passed counter
    mov rcx, [rbp+16]
    jrcxz fill_quit
    
    ; get parameters from stack
    mov rax, [rbp+24]
    mov rdi, [rbp+32]
 
fill_payload:
    ; fill loop
    mov [rdi], al
    loop fill_payload
    
    ; restore registers value
    mov rax, [rbp-16]
    mov rdi, [rbp-24]
    
fill_quit:
    ; restore stack
    mov rcx, [rbp-8]
    mov rsp, rbp
    pop rbp
    ret
    
section .bss
    array resb 256
http://rextester.com/KZM21563 PS. Собственно решил узнать, что такое stack frame, хотя-бы примерно, а то до этого в дизассемблере для меня были темным лесом конструкции:
frame:
    push ebp
    mov ebp, esp
    sub esp, 16 ; allocate stack memory
 
        ; [ebp - n] - points to allocated memory
    ; [ebp] - points to old value of ebp
        ; [ebp + 4] - points to the return address
    ; [ebp + n] - parameters for function
 
    mov esp, ebp
    pop ebp
    ret
Вкратце по функции, это мой быдло аналог
std::memset(void*, int value, std::size_t count);
Заливает count байт памяти, по переданному адресу, значением переданного байта (передаю rax, юзаю al).

Решение задачи: «NASM: Invalid memory reference (SIGSEGV)»

textual
Листинг программы
0  ---> Рост --->        RSP        FFFFFFFEh
 |-------------------------|-----------|
                              Фрейм в 24 байта

Оцени полезность:

6   голосов , оценка 4.167 из 5