
- •Трансляция программы
- •Компоновка программы
- •Система команд микропроцессора
- •32 Разрядные регистры:
- •Целочисленные арифметические команды
- •Особенности реализации микропроцессоров
- •Регистры: пользовательские и системные
- •Программа на языке ассемблера
- •Цепочечные команды
- •Осуществление переходов
- •Счётчик адреса команд
- •Безусловные переходы
- •Команда безусловного перехода jmp
- •Защищённый режим работы микропроцессора
- •Регистры управления
- •Регистры системных адресов
- •Сложные структуры данных
- •Доступ к элементам массива
- •Двумерные массивы
- •Структура
- •Сложные структуры данных 2
- •Методы работы со структурой
- •Объединение
- •Модульное программирование -1
- •Технологии программирования
- •Процедуры в языке ассемблера
- •Модульное программирование – 2 Передача аргумента через регистр
- •Передача аргументов через общую область памяти
- •Передача аргументов через стек
- •Связь ассемблера с языками высокого уровня
- •Макросредства языка ассемблера
- •Создание Windows приложений на ассемблере
- •Процесс производства микропроцессора
Передача аргументов через общую область памяти
Этот вариант передачи аргументов предполагает, что вызывающая и вызываемая программа условились использовать некоторую область памяти как общую. Транслятор предоставляет специальное средство для организации такой области памяти. Называется он атрибут комбинирования сегментов. Наличие данного атрибута указывает компоновщику как нужно комбинировать сегменты имеющие оно имя.
Common
Значение common говорит о том, что все сегменты имеющие одинаковое имя в объединяемых модулях будут располагается компоновщиком начиная с одного адреса оперативной памяти.
Недостатком этого способа в реальном режиме работы микропроцессора является отсутствие средств защиты данных от разрушений, т.к. нельзя проконтролировать соблюдение правил доступа к данным.
Передача аргументов через стек
Суть способа заключается в том, что вызывающая процедура самостоятельно заносит в стек передаваемые данные, после чего производит вызов процедуры.
Стек обслуживается 3 регистрами ss, sp и bp. Микропроцессор автоматически работает с регистрами ss и sp, в предположении, что они всегда указывают на вершину стека. Для осуществления произвольного доступа к данным в стеке архитектура микропроцессора имеет специальный регистр bp которая автоматически предполагает работу с сегментом стека. Перед использованием этого регистра, для доступа к данным стека, его содержимое необходимо правильно проинициализировать, что предполагает формирование в нём адреса, который бы указывал непосредственно на переданные данные. Для этого в начало процедуры рекомендуется включать дополнительный фрагмент кода, который имеет название «пролог процедуры».
Обычно код пролога состоит из 2 команд:
Push bp
Mov bp,sp
Команда push сохраняет содержимое bp в стеке с тем, чтобы исключить порчу находящегося в нём значения.
Вторая команда настраивает bp на вершину стека.
Конец
Конец процедуры должен быть оформлен особым образом и содержать действия обеспечивающие корректный возврат из процедуры. Фрагмент кода выполняющие такие действия называется «эпилог процедуры». Код эпилога должен восстановить контекст программы, точки вызова процедуры из вызывающей программы. При этом нужно откорректировать содержимое стека, убрав из него аргументы передававшиеся в процедуру. Это можно сделать несколькими способами:
Используя последовательность из n команд pop xx - Лучше всего это делать в вызывающей программе сразу после возврата управления из процедуры.
Add sp, NN – откорректировать регистр указателя стека sp на вершину 2*N
Используя команду ret n в качестве последней исполняемой команды в процедуре, где n – это количество байт на которое нужно увеличивать содержимое регистра sp после того как со стека будут сняты составляющие адреса возврата. Это способ выполняется микропроцессором автоматически.
Связь ассемблера с языками высокого уровня
Комбинирование программ на языке высокого уровня с кодом на ассемблере используется в том случае, если присутствуют участки, которые невозможно реализовать без помощи ассемблера, либо его применение значительно повысит эффективность.
Существуют следующие формы комбинирования программ на языке высокого уровня с ассемблером:
Использование операторов типа inline и ассемблерных вставок. Эта форма сильно зависит от синтаксиса языка высокого уровня и конкретного компилятора. Она предполагает, что ассемблерные коды виде команд ассемблера или прямо в машинных командах вставляются прямо в текст программы на языке высокого уровня. Компилятор языка распознаёт их как ассемблер и без изменений включает в формируемый объектный код.
Использование внешних процедур и функций. Написание и отладку программ можно производить независимо. Написанные программы можно использовать в др. проектах. Облегчается модификация и сопровождение подпрограмм в течении жизненного цикла проекта.
Возможны 2 вида связи:
Программа на языке высокого уровня вызывает процедуру на ассемблере
Программа на ассемблере вызывает
Имя процедуры PROC[[модификатор]язык][расстояние]
Операнд «язык» |
язык |
Направление передачи аргументов |
Какая процедура очищает стек |
Nolanguae |
Ассемблер |
Слева направо |
Вызываемая |
Basic |
Basic |
Слева направо |
Вызываемая |
ProloG |
Prolog |
Справа налево |
Вызывающая |
FORTRAN |
Fortran |
Слева направо |
Вызываемая |
C |
C |
Справа налево |
Вызывающая |
C++ |
C++ |
Справа налево |
Вызывающая |
PASCAL |
Pascal |
Слева направо |
Вызываемая |
STDCALL |
- |
Справа налево |
Вызываемая |
SYSCALL |
C++ |
Справа налево |
Вызывающая |