Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Стек. команды для работы со стеком




Стеком называется структура данных, организованная по принципу LIFO. Стек является неотъемлемой частью архитектуры процессора и поддерживается на аппаратном уровне: в процессоре есть специальные регистры (SS, BP, SP) и команды для работы со стеком.

Обычно стек используется для сохранения адресов возврата и передачи аргументов при вызове процедур (о процедурах в следующей части), также в нём выделяется память для локальных переменных. Кроме того, в стеке можно временно сохранять значения регистров.

 

       В стек можно добавлять элементы (PUSH) и извлекать (POP).

 

PUSH. У этой команды один операнд, который может быть непосредственным значением, 16-битным регистром (в том числе сегментым) или 16-битной переменной в памяти. Команда работает следующим образом:

· значение в регистре SP уменьшается на 2 (так как ширина стека — 16 бит или 2 байта);

· операнд помещается в память по адресу в SP.

 

Существуют ещё 2 команды для добавления в стек. Команда PUSHF помещает в стек содержимое регистра флагов. Команда PUSHA помещает в стек содержимое всех регистров общего назначения в следующем порядке: АХ, СХ, DX, ВХ, SP, BP, SI, DI (значение DI будет на вершине стека). Значение SP помещается то, которое было до выполнения команды. Обе эти команды не имеют операндов.

 

POP. У этой команды также один операнд, который может быть 16-битным регистром (в том числе сегментым, но кроме CS) или 16-битной переменной в памяти. Команда работает следующим образом:

· операнд читается из памяти по адресу в SP;

· значение в регистре SP увеличивается на 2.

Обратите внимание, что извлеченный из стека элемент не обнуляется и не затирается в памяти, а просто остаётся как мусор. Он будет перезаписан при помещении нового значения в стек.

 

Соответственно, есть ещё 2 команды. POPF помещает значение с вершины стека в регистр флагов. POPA восстанавливает из стека все регистры общего назначения (но при этом значение для SP игнорируется).

 

 

Процедуры. Команды для организации процедур. Ближний и дальний вызов. Способы передачи параметров

Процедура – участок кода, который вызывается из различных мест программы.После выполнения, процедура управления возвращается в точку вызова.

Вызов происходит командой CALL.Эта команда работает почти также, как команда безусловного перехода (JMP), но с одним отличием — одновременно в стек сохраняется текущее значение регистра IP. Это позволяет потом вернуться к тому месту в коде, откуда была вызвана процедура. В качестве операнда указывается адрес перехода, который может быть непосредственным значением (меткой), 16-разрядным регистром (кроме сегментных) или ячейкой памяти, содержащей адрес.

Возврат из процедуры выполняется командой RET. Эта команда восстанавливает значение из вершины стека в регистр IP. Таким образом, выполнение программы продолжается с команды, следующей сразу после команды CALL. Обычно код процедуры заканчивается этой командой. Команды CALL и RET не изменяют значения флагов (кроме некоторых особых случаев в защищенном режиме).

 

Существует 2 типа вызовов процедур. Ближним называется вызов процедуры, которая находится в текущем сегменте кода. Дальний вызов — это вызов процедуры в другом сегменте. Соответственно существуют 2 вида команды RET — для ближнего и дальнего возврата.

 

Кроме передачи параметров часто нужно получить какое-то значение из процедуры. Например, если процедура что-то вычисляет, хотелось бы получить результат вычисления. А если процедура что-то делает, то полезно узнать, завершилось действие успешно или возникла ошибка. Существуют разные способы возврата значения из процедуры, но самый часто используемый — это поместить значение в один из регистров. Обычно для этой цели используют регистры AL и AX.

 

Соглашения вызова. Соглашение вызова MS-DOS. Соглашения pascal, ccall, stdcall и др

Основное соглашение о вызовах pascal предполагает, что параметры кладутся в стек в прямом порядке. Указатель стека на исходную позицию возвращает подпрограмма. Изменяемые параметры передаются по ссылке, а в параметр (E)AX записывается результат.

Соглашение о вызовах ccall и stdcallпредполагают, что параметры помещаются в стек в обратном порядке. Очистку стека производит вызывающая подпрограмма.

 

Стековый фрейм. Пролог и эпилог. Выделение памяти для локальных переменных

Стековый фрейм — это часть стека, в которой лежат параметры, локальные переменные, адрес возврата и сохранённое значение (E)BP, т.е. всё то, что легло в стек ради вызова процедуры.

 

При вызове процедуры аргументы отправляются в стек, и только потом производится вызов подпрограммы. Таким образом, процедура получает стек, на вершине которого лежит адрес возврата, а под ним — аргументы, с которыми она была вызвана. При возвращении из процедуры аргументы должны быть сняты со стека.

 

Пролог – часть процедуры, которая подготавливает процедуру к работе с параметрами.

Эпилог – часть процедуры, которая восстанавливает состояние, необходимое для продолжения выполнения вызывающего кода.

 

Чтобы создать локальные переменные в процедуре, необходимо выделить для них память. Эта память выделяется в стеке. Сделать это очень просто — достаточно вычесть из регистра SP значение, равное суммарному размеру всех локальных переменных в процедуре. Так как ширина стека равна 16 бит, то это значение должно быть кратно 2 байтам. При выходе из процедуры нужно восстановить указатель стека. Если локальных переменных нет, указатель стека и так будет там, где надо. В противном случае это выполняется командой MOV SP,BP (В BP сохраняется значение SP при входе в процедуру, как в случае с параметрами, передаваемыми через стек).

 

 

Прерывания. Таблица векторов прерываний. Обработка прерываний: вызов обработчика и возврат из него. Перехват прерываний.

Прерывания – инициализируемый определённым образом процесс, временно переключающий процессор на выполнение другой программы с последующим возобновлением выполнения прерванной программы. Прерывания бывают аппаратными и программными

 

Предусмотрено 256 номеров прерываний, из них 0-31 зарезервировано, остальные доступны для программистов.

 

IDT – таблица векторов прерываний. Находится по адресу 0000:0000. Представляет собой массив полных адресов обработчиков прерываний 2 байта сегмент, 2 байта смещение. Индекс в массиве – номер прерывания. Пример обработки прерывания от таймера.

· Таймер генерирует прерывание;

· Процессор приостанавливает выполнение текущей программы;

· Адрес обработчика записан по адресу 0000:0020;

· сallfar [0000:0020];

· Сохранение флагов;

· Обработчик возвращает управление, процессор возвращается к выполнению прерванной программы.

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 256.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...