Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
sistemnoe_programmirovanie / 06 Мр по лаб_раб_Асс_инф.doc
Скачиваний:
135
Добавлен:
18.02.2016
Размер:
1.18 Mб
Скачать

2.3 Контрольные вопросы

  1. Изложите алгоритм преобразования ASCII-кода числа с произвольным основанием в двоичное число.

  2. Изложите алгоритм преобразования двоичного числа в ASCII-строку числа с произвольным основанием.

  1. В чём заключается концепция модульного программирования?

  2. Укажите основные синтаксические различия в организации программных модулей, принадлежащих одной программе?

  3. Как вы понимаете принцип локализации переменных в модуле и деление переменных модуля на внутренние и внешние.

  4. Как экспортировать из модуля процедуры, числовые константы и переменные в другие модули?

  5. Как импортировать в модуль процедуры, числовые константы и переменные из других модулей?

  6. Напишите команду, создающую библиотеку mta.libиз объектных модулейa.obj, b.objиc.obj.

  7. Напишите команду создания исполнительного файла программы с главным модулем main.obj, вспомогательные модули которого находятся в библиотекеmylib.

Список литературы:

1-48с., 2-221с., 3-258с., 4-218с.

Лабораторная работа № 3

Модульное программирование. Организация интерфейса с процедурой. Передача аргументов через регистры, через общую область памяти, через стек. Возврат результата из процедуры.

3.1 Целевые установки

  • Ознакомление с технологией модульного программирования, с работой процедур на ассемблере.

  • Научиться составлять различные программы, используя процедуры.

  • Умело использовать данный материал при решении различных задач.

3.2 Методические рекомендации

3.2.1 Краткое описание теоретического материала

Концепция модульного программирования.

  • Функциональная декомпозиция задачи – разбиение большой задачи на ряд более мелких, функционально самостоятельных подзадач – модулей.

  • Модуль – основа концепции модульного программирования. Каждый модуль в функциональной декомпозиции представляет собой «черный ящик» с одним входом и одним выходом.

  • Реализуемые решения должны быть простыми и ясными.

  • Назначение всех переменных модуля должно быть описано с помощью комментариев.

Процедуры в языке ассемблера.

Размещение процедур в программе:

  • в начале программы (до первой исполняемой команды);

  • в конце (после команды, возвращающей управление операционной системе);

  • промежуточный вариант – тело процедуры располагается внутри другой процедуры или основной программы;

  • в другом модуле.

Для того, чтобы объявить о видимых извне объектах, программа должна использовать две директивы: extern и public. Директива extern - для объявления некоторого имени внешним по отношению к данному модулю. Это имя в другом модуле должно быть объявлено в директиве public. Директива public для объявления некоторого имени видимым в других модулях.

extern имя: тип, …, имя: тип

public имя, …, имя

Имя – идентификатор, определенный в другом модуле. Это:

  • имена переменных, определенных директивами типа db, dd и т.д.;

  • имена процедур;

  • имена констант, определенных операторами = и equ.

Возможные значения типа определяются допустимыми типами объектов для этих директив:

  • если имя – это имя переменной, то тип может принимать значения byte, word и т.д.;

  • если имя – это имя процедуры, то тип может принимать значение near или far;

  • если имя – это имя константы, то тип должен быть abs.

; модуль 1

masm

.model small

.stack 256

.data

.code

my_proc1 proc

my_proc1 endp

my_proc2 proc

my_proc2 endp

public my_proc1

start:

mov ax, @data

end start

; модуль 2

masm

.model small

.stack 256

.data

.code

extern my_proc1

start:

mov ax, @data

call my_proc1

end start

Существуют следующие варианты передачи аргументов в модуль:

  • через регистры;

  • через общую область памяти;

  • через стек;

  • с помощью директив extern и public.

Передача аргументов через регистры.

Данные становятся доступными немедленно после передачи управления процедуре. Ограничения:

  • небольшое число доступных для пользователя регистров;

  • нужно постоянно помнить о том, какая информация в каком регистре находится;

  • ограничение размера передаваемых данных размерами регистра (если размер данных превышает 8, 16 или 32 бит, то передачу данных посредством регистров произвести нельзя).

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

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

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

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

; пролог процедуры

push bp

mov bp, sp

; эпилог процедуры

mov sp, bp

pop bp

ret

Использование директив extern и public.

Варианты применения данных директив:

  • оба модуля используют только сегмент данных вызывающей программы;

  • у каждого из модулей есть свой собственный сегмент данных;

  • использование атрибута комбинирования (объединения) сегментов private в директиве сегментации segment.

Возврат результата из процедуры возможен:

с использованием регистров; с использованием общей области памяти; с использованием стека.