Значения входных параметров должны быть известны до обращения к подпрограмме. Вх. параметры могут передаваться как по значению, так и по адресу. Входными параметрами могут быть выражения, в том числе константы и переменные.
Выходные параметры могут передаваться только по адресу.
Описание подпрограммы в языке ассемблер имеет следующую структуру:
<имя процедуры> proc <тип процедуры>
...
операторы тела подпрограммы
...
ret [<выражение>]
<имя процедуры> endp
<тип процедуры> - определяет тип перехода: near (близкий), far (дальний).
Если тип не задан, по умолчанию принимается near. Тип перехода near показывает, что тело процедуры описано в том же сегменте, что и её вызов. Тип перехода far обеспечивает вызов процедуры из других сегментов, с другим значением регистра CS. Такие процедуры обычно используются как отдельные объектные модули или в составе библиотек. ret [<выражение>] - выполняет возврат из процедуры в вызывающую программу. В зависимости от типа процедуры, эта команда восстанавливает из стека значение IP (ближний вызов) или CS:IP (дальний вызов). Эта команда не обязана быть последней по тексту процедуры, но является последней по порядку выполнения. Значение <выражение> указывает размер стека в байтах, восстанавливаемого при возврате из процедуры. Восстановление стека необходимо производить при передаче параметров процедуры через стек. Так как работа со стеком выполняется словами, значение <выражение> всегда должно быть кратным двум. Допускается вложение описания подпрограммы внутрь описания другой подпрограммы.
28. Логические инструкции микропроцессора Cortex-M3. Примеры.
30. Этапы создания исполняемого файла для микропроцессора Cortex-M3.
29. Инструкции передачи управления микропроцессора Cortex-M3. Примеры. (можно разбить)
передача управления осуществляется с помощью инструкций безусловных и условных переходов, вызовов процедур и прерываний (исключений). Безусловный переход (JMP) может быть как внутрисегментным (ближним или коротким), так и межсегментным (дальним). Адрес перехода может непосредственно указывать в команде, а при косвенной адресации адрес перехода находится в регистре или памяти и может иметь дополнительные слагаемые. Короткий переход (short) может передавать управление только на адрес назначения, удаленный от текущего в пределах от –128 до +127 байт, ближний (near) – в пределах сегмента. При дальнем (far) переходе адрес назначения (непосредственный или косвенный) включает новое значение указателя инструкций и значение (или селектор) сегмента кода, обеспечивая доступ к любой точке памяти (в пределах, разрешенных защитой).
Условные переходы в 8086 и 80286 возможны только короткие (8–байтовое смещение), процессоры 386+ допускают переход в пределах 16– или 32–байтного смещения, в зависимости от режима адресации. Условные переходы выполняются по состоянию флагов и/или содержимому регистра CX (ECX). Инструкции циклов комбинируют условный переход с декрементом регистра CX (ECX).
Инструкция вызова процедуры (CALL) передает управление в точку перехода, сохраняя адрес следующей за ней инструкции в стеке. По инструкции возврата (RET) этот адрес восстановится в указатель инструкций (и в CS при дальнем вызове). Как и безусловный переход, вызов и возврат могут быть как внутрисегментным (ближним), так и межсегментным, допуская те же режимы адресации.
34. Директивы резервирования памяти.
AREA - указывает асемблеру начало новой секции кода или данных.
Синтаксис: AREA имя_секции {,атрибут 1}{,атрибут 2}
Имя секции обязательный параметр.
Атрибуты:
CODE - секция содержит машинные инструкции. Секции с атрибутом CODE по умолчанию имеют атрибут READONLY
READONLY - указывает что запись в данную секцию запрещена
READWRITE - указывает компилятору, что разрещена запись и чтерие секций
DATA - секция содержит данные. Секции с атрибутом DATA поумолчанию имеют атрибут READWRITE
GROUP =имя_группы- указагие включить данную секцию в группу
NOINIT -указывает, что секция данных содержит неинициализированные данные или инициализированные нулями.
DCB - резервирование одного (или нескольких байт) и присвоение начального значения.
Синтаксис: {метка(имя}DCB выражение1{выражение 2}
Пример:
Var1 DCB 5
MAS DCB Ox34,28,-23,2_100100110
SYM DCB “Y”
DSW - резервирование одного(или нескольких полуслов) выровненных по границе 2-байтного слова и присвоение начального значения
Синтаксис: {метка(имя}DSW выражение1{выражение 2}
Пример:
Var1 DSW 45
DCWU - тоже самое, но без выравнивания
SPACE- резервирует блок памяти заполненный нулями
FILL - резервирует блок памяти заполненный заданным значением
Синтаксис:
{метка}SPACE выражение
{метка}FILL выражение{, значение{,размер}}
Размер=[1,2,4], по-умолчанию=1 (в байтах)
DCQ- резервирование одного (или нескольких) 64-слов выровненных по границе 4-байтного слова и присвоение начального значения
DCQU- то же самое но без выравнивания
Синтаксис:
{метка} DCQ значение{, значение}
{метка}DCQU значение{, значение}
DCD - резервирование одного (или нескольких) 32-слов выровненных по границе 4-байтного слова и присвоение начального значения
DCDU- то же самое но без выравнивания
Синтаксис:
{метка} DCDзначение{, значение}
{метка}DCDU значение{, значение}