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