Я предполагаю, что приведенный выше код вызывает функции C malloc()
и free()
...
Если 1-й malloc()
завершится неудачно, вы получите dealloc_1
с любым мусором в r11
и r12
после возврата из malloc()
.
Если 2-й malloc()
не пройден, вы получите dealloc_1
с любым мусором в r12
после возвращения из malloc()
.
Поэтому перед выполнением первого выделения необходимо обнулить r11
и r12
.
Поскольку это 64-разрядный режим, все указатели / адреса и размеры обычно являются 64-разрядными.,Когда вы передаете один из них в функцию, он должен быть 64-битным.Итак, push dword 16
не совсем верно.Это должно быть push qword 16
вместо этого.Аналогично, когда вы удаляете эти параметры из стека, вы должны удалить ровно столько байтов, сколько положили туда, поэтому add rsp, 4
должно измениться на add rsp, 8
.
Наконец, я незнать, какие регистры malloc()
и free()
сохраняют, а какие нет.Вам может потребоваться сохранить и восстановить так называемый volatile registers
(см. Документацию вашего компилятора C).То же самое относится и к коду, который не показан.Он должен сохранять r11
и r12
, чтобы их можно было использовать для освобождения. РЕДАКТИРОВАТЬ : И я бы проверил, является ли это правильным способом передачи параметров через стек (снова, см. Документацию вашего компилятора).
РЕДАКТИРОВАТЬ : вытестирование r11
на 0 непосредственно перед вторым free()
.Это должно быть r12
.Но free()
не против получить указатели NULL.Таким образом, эти проверки могут быть удалены.
Обратите внимание на ваш код.