Освобождает стековый фрейм, установленный предыдущей инструкцией ENTER. Инструкция LEAVE копирует указатель фрейма (в регистре BP) в регистр указателя стека (SP), который освобождает пространство стека, выделенное для стекового фрейма. Старый указатель фрейма (указатель фрейма для вызывающей процедуры, который был сохранен инструкцией ENTER) затем извлекается из стека в регистр BP, восстанавливая фрейм стека вызывающей процедуры.
Инструкция RET обычно выполняется после инструкции LEAVE, чтобы вернуть управление программой вызывающей процедуре.
LEAVE - Устанавливает для SP значение BP, затем выталкивает значение BP.
- title Автор: Довгополов Евгений Сергеевич
- .286C
- .model small
- .stack 100h
- code segment public ________________; Начало сегмента кода
- ____assume cs:code
- ____main proc ______________________; Начало процедуры main
- ________mov_____ax, 10______________; Копируем значение 10 в регистр ax
- ________mov_____bx, 20______________; Копируем значение 20 в регистр bx
- ________call____function____________; Вызываем процедуру function
- ________mov_____ax, 4C00h___________; Копируем значение функции завершения процесса в ah а значение в al
- ________int_____21h ________________; Вызываем прерывание DOS
- ____main endp ______________________; Конец процедуры main
- ____function proc___________________; Начало процедуры function
- ________enter___4, 0________________; Создаём фрейм стека на 4 байта для двух локальных переменных
- ________push____ax__________________; Ложим значение регистра ax на вершину стека
- ________push____bx__________________; Ложим значение регистра bx на вершину стека
- ________mov_____word ptr[bp-2], ax__; Копируем значение регистра ax в первой локальной переменной
- ________mov_____word ptr[bp-4], bx__; Копируем значение регистра bx во второй локальной переменной
- ________mov_____cx, word ptr[bp-2]__; Копируем значение первой локальной переменной в cx
- ________mov_____dx, word ptr[bp-4]__; Копируем значение второй локальной переменной в dx
- ________pop_____bx__________________; Выталкиваем значение из верхней части стека в bx
- ________pop_____ax__________________; Выталкиваем значение из верхней части стека в ax
- ________leave_______________________; Уничтожаем фрейм стека
- ________ret_________________________; Возврат из процедуры
- ____function endp___________________; Конец процедуры function
- code ends __________________________; Конец сегмента кода
- end main ___________________________; Конец файла. Точкой входа указывается процедура main