- •Трансляция программы
- •Компоновка программы
- •Система команд микропроцессора
- •32 Разрядные регистры:
- •Целочисленные арифметические команды
- •Особенности реализации микропроцессоров
- •Регистры: пользовательские и системные
- •Программа на языке ассемблера
- •Цепочечные команды
- •Осуществление переходов
- •Счётчик адреса команд
- •Безусловные переходы
- •Команда безусловного перехода jmp
- •Защищённый режим работы микропроцессора
- •Регистры управления
- •Регистры системных адресов
- •Сложные структуры данных
- •Доступ к элементам массива
- •Двумерные массивы
- •Структура
- •Сложные структуры данных 2
- •Методы работы со структурой
- •Объединение
- •Модульное программирование -1
- •Технологии программирования
- •Процедуры в языке ассемблера
- •Модульное программирование – 2 Передача аргумента через регистр
- •Передача аргументов через общую область памяти
- •Передача аргументов через стек
- •Связь ассемблера с языками высокого уровня
- •Макросредства языка ассемблера
- •Создание Windows приложений на ассемблере
- •Процесс производства микропроцессора
Процедуры в языке ассемблера
Для оформления процедур как отдельных объектов существует специальная директива:
PROC/ENDP
И машинная команда RET
Процедуры, так же как и макрокоманды, ценны тем, что могут быть активизированы в любом месте программы. Процедурам, как и макрокомандам, могут быть переданы некоторые аргументы, что позволяет, имея одну копию кода в памяти изменять её для каждого конкретного случая использования.
Возможные варианты размещения процедур в программе:
В начале программы до первой исполняемой команды
В конце программы, после команды, возвращающей управление ОС
Тело процедуры располагается внутри другой процедуры
В другом модуле
Т.к. отдельный модуль – это функционально-автономный объект, то он ничего не должен знать о внутреннем устройстве других модулей и наоборот. Каждый модуль должен иметь такие средства, с помощью которых он извещал бы транслятор о том, что некоторый объект должен быть видимым вне этого модуля. Это позволит транслятору правильно сформировать машинные команды. На своём этапе компоновщики произведут настройку модулей и разрешат все внешние ссылки в объединяемых модулях.
Для того чтобы объявить о подобного рода видимых из вне объектах, программа должна использовать 2 директивы:
Extrn имя : тип, … , имя:тип
Public имя , … , имя
Директива extrn предназначена для объявления некоторого имени внешним по отношению к данному модулю.
Директива public предназначена для объявления некоторого имени определённого в этом модуле и видимого в других модулях.
В синтаксисе имя – это идентификатор, определённый в другом модуле. В качестве него могут выступать
Имена переменных, определённых директивами db или dw.
Имена процедур
Имена констант определённых операторами «=» и “equ”
Тип определяет тип идентификатора. Указание типа необходимо для того, чтобы транслятор правильно сформировал машинную команду. Действительные адреса будут вычислены на этапе редактирования, когда будут разрешаться внешние ссылки. Возможное значение типа определяется допустимыми типами объектов для этих директив.
Имя – это… |
Возможные значения |
Имя переменной |
Byte, word, dword, pword, fword, qword, tbyte |
Имя процедуры |
Near, far |
Имя константы |
Abs |
Аргумент – это ссылка на некоторые данные, которые требуются, для выполнения возложенных на модуль функций и разрешённых вне этого модуля. Аргументы бывают формальными и фактическими.
Формальный аргумент – это место-держатель для действительных данных, которые будут подставлены с помощью фактического аргумента. Фактический аргумент – это то, что передаётся на место формального аргумента.
Существующие варианты передачи аргумента в модуль:
Через регистр
Через общую область памяти
Через стек
С помощью директивы extrn и public
Модульное программирование – 2 Передача аргумента через регистр
Это наиболее простой в реализации способ передачи данных. Данные переданные подобным способом становятся доступными немедленно после управления передачи процедуре. Этот способ наиболее эффективен при небольшом объеме передаваемых данных.
Ограничения на способ передачи аргументов через регистр:
Небольшое число доступных для пользователя регистров
Нужно постоянно помнить о том, какая информация в каком регистре находится
Ограничение размера передаваемых данных размерами регистра. В случае превышения необходимо передавать не сами данные, а указатели на них
