NASM: Invalid memory reference (SIGSEGV) - Assembler
Формулировка задачи:
Всем привет. Изучаю ассемблер, пользуюсь NASM. Подскажите нубасу, что не так в коде?
Я вот что-то не могу найти "не валидную ссылку на память". Что не так? Спасибо.
http://rextester.com/KZM21563
PS. Собственно решил узнать, что такое stack frame, хотя-бы примерно, а то до этого в дизассемблере для меня были темным лесом конструкции:
Заливает count байт памяти, по переданному адресу, значением переданного байта (передаю rax, юзаю al).
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 256frame:
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);
Решение задачи: «NASM: Invalid memory reference (SIGSEGV)»
textual
Листинг программы
0 ---> Рост ---> RSP FFFFFFFEh
|-------------------------|-----------|
Фрейм в 24 байта