Системный вызов sys_brk() предоставляется ядром для выполнения выделения памяти без необходимости перемещать её позже. Данная системная функция позволяет установить наибольший доступный адрес в секции data.
Этот наибольший адрес памяти, который необходимо установить, и является единственным параметром, принимаемым данным системным вызовом. Это значение сохраняется в регистре EBX.
В случае возникновения любой ошибки, системный вызов sys_brk() возвращает -1
или фактический код ошибки.
В следующем примере демонстрируется динамическое выделение 16 КБ памяти с помощью системного вызова sys_brk():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
section .text global _start ; объявляем для использования gcc _start: ; сообщаем линкеру входную точку mov eax, 45 ; sys_brk() xor ebx, ebx int 80h add eax, 16384 ; количество байтов для резервирования mov ebx, eax mov eax, 45 ; sys_brk() int 80h cmp eax, 0 jl exit ; выполняем exit, если возникла ошибка mov edi, eax ; EDI = наибольший доступный адрес sub edi, 4 ; указываем на последний DWORD mov ecx, 4096 ; количество выделенных значений типа DWORD xor eax, eax ; очищаем регистр EAX std ; назад rep stosd ; повторяем для всей выделенной области cld ; помещаем флаг DF в обычное положение mov eax, 4 mov ebx, 1 mov ecx, msg mov edx, len int 80h ; выводим сообщение на экран exit: mov eax, 1 xor ebx, ebx int 80h section .data msg db "Allocated 16 kb of memory!", 10 len equ $ - msg |
Результат выполнения программы:
Allocated 16 kb of memory!
Спасибо тебе большое 🙂
а будет продолжение по Nasm?
Скорее всего, нет.
Классно всё разжовано!
Вот если бы аппаратные прерывания разжевали)
IDTR, перехват прерываний, …
Как часто выходят новые уроки? Это полный курс? (Сайт просто опупенный, вы даелаете офигенный ресурс ребята)
Это самые лучшие уроки по Ассемблеру!
Будет продолжение? Продолжите пожалуйста!
Курс великолепен. Огромное спасибо автору за проделанную работу.
Просто о сложном.
Где тут у вас донат ?