Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессоры Лекции.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
65.84 Кб
Скачать

Передача аргументов через общую область памяти

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

Common

Значение common говорит о том, что все сегменты имеющие одинаковое имя в объединяемых модулях будут располагается компоновщиком начиная с одного адреса оперативной памяти.

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

Передача аргументов через стек

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

Стек обслуживается 3 регистрами ss, sp и bp. Микропроцессор автоматически работает с регистрами ss и sp, в предположении, что они всегда указывают на вершину стека. Для осуществления произвольного доступа к данным в стеке архитектура микропроцессора имеет специальный регистр bp которая автоматически предполагает работу с сегментом стека. Перед использованием этого регистра, для доступа к данным стека, его содержимое необходимо правильно проинициализировать, что предполагает формирование в нём адреса, который бы указывал непосредственно на переданные данные. Для этого в начало процедуры рекомендуется включать дополнительный фрагмент кода, который имеет название «пролог процедуры».

Обычно код пролога состоит из 2 команд:

Push bp

Mov bp,sp

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

Вторая команда настраивает bp на вершину стека.

Конец

Конец процедуры должен быть оформлен особым образом и содержать действия обеспечивающие корректный возврат из процедуры. Фрагмент кода выполняющие такие действия называется «эпилог процедуры». Код эпилога должен восстановить контекст программы, точки вызова процедуры из вызывающей программы. При этом нужно откорректировать содержимое стека, убрав из него аргументы передававшиеся в процедуру. Это можно сделать несколькими способами:

  1. Используя последовательность из n команд pop xx - Лучше всего это делать в вызывающей программе сразу после возврата управления из процедуры.

  2. Add sp, NN – откорректировать регистр указателя стека sp на вершину 2*N

  3. Используя команду ret n в качестве последней исполняемой команды в процедуре, где n – это количество байт на которое нужно увеличивать содержимое регистра sp после того как со стека будут сняты составляющие адреса возврата. Это способ выполняется микропроцессором автоматически.

Связь ассемблера с языками высокого уровня

Комбинирование программ на языке высокого уровня с кодом на ассемблере используется в том случае, если присутствуют участки, которые невозможно реализовать без помощи ассемблера, либо его применение значительно повысит эффективность.

Существуют следующие формы комбинирования программ на языке высокого уровня с ассемблером:

  • Использование операторов типа inline и ассемблерных вставок. Эта форма сильно зависит от синтаксиса языка высокого уровня и конкретного компилятора. Она предполагает, что ассемблерные коды виде команд ассемблера или прямо в машинных командах вставляются прямо в текст программы на языке высокого уровня. Компилятор языка распознаёт их как ассемблер и без изменений включает в формируемый объектный код.

  • Использование внешних процедур и функций. Написание и отладку программ можно производить независимо. Написанные программы можно использовать в др. проектах. Облегчается модификация и сопровождение подпрограмм в течении жизненного цикла проекта.

Возможны 2 вида связи:

  1. Программа на языке высокого уровня вызывает процедуру на ассемблере

  2. Программа на ассемблере вызывает

Имя процедуры PROC[[модификатор]язык][расстояние]

Операнд «язык»

язык

Направление передачи аргументов

Какая процедура очищает стек

Nolanguae

Ассемблер

Слева направо

Вызываемая

Basic

Basic

Слева направо

Вызываемая

ProloG

Prolog

Справа налево

Вызывающая

FORTRAN

Fortran

Слева направо

Вызываемая

C

C

Справа налево

Вызывающая

C++

C++

Справа налево

Вызывающая

PASCAL

Pascal

Слева направо

Вызываемая

STDCALL

-

Справа налево

Вызываемая

SYSCALL

C++

Справа налево

Вызывающая