Я пытаюсь экспериментировать с malloc и свободно в ассемблере (NASM, 64 бит).Malloc и Free множественные массивы в сборке
Я попытался malloc два массива, каждый с пространством для 2 64-битных чисел. Теперь я хотел бы иметь возможность записывать их значения (не уверен, что если/как их доступ будет работать точно), а затем в конце всей программы или в случае ошибки в любой точке, освободите память.
Что я сейчас отлично работает, если есть один массив, но как только я добавить еще один, он терпит неудачу на первой попытке освободить любую память :(
Мой код в настоящее время следующие:
extern printf, malloc, free
LINUX equ 80H ; interupt number for entering Linux kernel
EXIT equ 60 ; Linux system call 1 i.e. exit()
segment .text
global main
main:
push dword 16 ; allocate 2 64 bit numbers
call malloc
add rsp, 4 ; Undo the push
test rax, rax ; Check for malloc failure
jz malloc_fail
mov r11, rax ; Save base pointer for array
; DO SOME CODE/ACCESSES/OPERATIONS HERE
push dword 16 ; allocate 2 64 bit numbers
call malloc
add rsp, 4 ; Undo the push
test rax, rax ; Check for malloc failure
jz malloc_fail
mov r12, rax ; Save base pointer for array
; DO SOME CODE/ACCESSES/OPERATIONS HERE
malloc_fail:
jmp dealloc
; Finish Up, deallocate memory and exit
dealloc:
dealloc_1:
test r11, r11 ; Check that the memory was originally allocated
jz dealloc_2 ; If not, try the next block of memory
push r11 ; push the address of the base of the array
call free ; Free this memory
add rsp, 4
dealloc_2:
test r12, r12
jz dealloc_end
push r12
call free
add rsp, 4
dealloc_end:
call os_return ; Exit
os_return:
mov rax, EXIT
mov rdi, 0
syscall
Вы копируете-вставьте-сбой: dealloc_2 выполняет 'test r11, r11', но это должен быть' test r12, r12' (если требуется вообще) –