Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Assembler (Уч_пос_Лаб_Ч1).doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.43 Mб
Скачать

9.2.5. Вопросы построения многомодульных программ

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

Каждая из программ лабораторной работы может быть структурно разделена на следующие функционально законченные блоки (модули):

  • преобразование чисел с произвольным основанием (8-,10-,16-теричное), представленных в ASCII-формате, в двоичное число (в дальнейшем будем применять более короткое выражение "ASCII-число с основанием P");

  • преобразование двоичного числа в ASCII-число с P основанием;

  • вычислительный модуль или модуль преобразования введённых данных по заданному алгоритму.

Каждый такой модуль оформляется в виде подпрограммы или процедуры, допускающей автономное ассемблирование (трансляцию в объектный код). В результате после трансляции будут получены объектные модули, которые объединяются в единую многомодульную программу с помощью "системообразующего" главного модуля, по ходу исполнения которого осуществляется передача управления на обработку информации от одного модуля к другому. Укажем на три основных синтаксических отличия в организации главного модуля. Только в главном модуле выполняется:

  • инициализация сегмента стека директивой Stack;

  • инициализация сегмента данных

Start: mov ax,@data

mov ds,ax

  • каждый из модулей заканчивается директивой End, но только в главном модуле после этой директивы должна помещаться метка первой команды программы Start, с которой начинается её исполнение.

Исходный текст модуля должен иметь заголовок, в котором указывается:

  • назначение и особенности функционирования модуля;

  • описание входных данных;

  • описание выходных данных.

Все имена, описанные в модуле, локализуются в нём. Это значит, что в разных модулях программы можно пользоваться одинаковыми именами и никаких конфликтов из-за этого не будет. В то же время некоторые идентификаторы переменных или процедур могут быть общими для некоторых модулей. Через эти общие идентификаторы и осуществляется интерфейс модулей в процессе исполнения программы.

Каждый модуль может оперировать двумя типами идентификаторов: внутренними и внешними, которые определены или инициализированы в другом модуле. Все внешние имена переменных и процедур вводятся директивой

Extrn <имя>:<тип>,…,<имя >:<тип>.

Перечислим возможные значения типов.

  • Для переменных: byte, word, dword, … tbyte

  • Для числовых констант: abs (определяются через директиву присваивания =)

  • Для меток: near,far

  • Для процедур: proc

Однако, все внешние переменные (процедуры) для данного модуля, должны быть определены в каком-то другом модуле в качестве общедоступных с помощью директивы

Public <имя>, ,<имя>

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

%Title "#dec_bin.asm"

;Модуль ввода 10-тичного ASCII- числа с последующим его преобразованием в 16- разряд-

;ный двоичный дополнительный код.

;Вход: Вводимое с клавиатуры по запросу программы ASCII-число с основанием "10" в

;диапазоне от -32768 до 32767. Число вводится старшими разрядами вперёд с вводом знака "-

;" для отрицательных чисел. Ввод числа заканчивается спецификатором d.

;Выход: АХ- 16- разрядный двоичный дополнительный код,

; CF- ошибка ввода: выход из диапазона -32768...32767, либо ввод ошибочного символа.

Ideal

Model small

Dataseg

In_buf db 8,?,8 dup(?) ;5- разрядов +"знак "+ "спецификатор "+"CR"

Codeseg

public ASCIIdec_bin

proc ASCIIdec_bin

……………..

ret

endp ASCIIdec_bin

End

%Title "Bin_#bin.asm"

;Модуль для преобразования дополнительного кода двоичного числа из рег. АХ в ASCII-

;строку двоичных символов.

;Вход: АХ- дополнительный код двоичного числа.

;Выход: АХ- дополнительный код двоичного числа,

; Буфер Bin_buf – 16 байтная ASCII- строка двоичных символов.

Ideal

Model small

Dataseg

public Bin_buf

Bin_buf DB 16 dup(?)

Codeseg

public Bin_ASCIIbin

proc Bin_ASCIIbin

……………..

endp Bin_ASCIIbin

End

%Title "Bin_#dec.asm"

;Модуль для преобразования дополнительного кода двоичного числа в ASCII- число с

;основанием "10" и спецификатором d.

;Вход: АХ- дополнительный код двоичного числа.

;Выход: АХ- дополнительный код двоичного числа,

; 7-байтный буфер Dec_buf с восстановленным из рег. АХ десятичным числом (знак +

;5цифр + спец-тор).

Ideal

Model small

Dataseg

public Dec_buf

Dec_buf db 7 dup(?) ;Буфер с пробелами

Codeseg

public Bin_ASCIIdec

proc Bin_ASCIIdec

……………….

endp Bin_ASCIIdec

End

Ниже приводится один из возможных вариантов главного модуля, использующего вышеприведённые вспомогательные модули. В программе используется простой экранный интерфейс, основанный на материале лабораторной работы № 2. Вы можете его усовершенствовать на основе использования функций BIOS. Кроме того, с целью облегчения понимания работы программы объединены в одну две различные ошибки ввода – переполнение и неправильно введённый разряд числа.

%Title"#10bin10.asm"

;Демонстрационная программа ввода и преобразования десятичных знаковых чисел

;(диапазон -32768...32767) в двоичные и их обратное восстановление. Особенности

;работы с программой регламентируются сообщениями, выводимыми программой на экран.

Ideal

Model small

Stack 256

%nomacs ;Исключить из листинга макрорасширения

Macro out_str$ mes ;Макрос вывода строки mes

……………..

Endm out_str$

Macro out_buf buf,number ;Макрос вывода содержимого buf с числом байтов

;number

……………………..

Endm out_buf

Dataseg

extrn Bin_buf:byte:16, Dec_buf:byte:7

mes1 DB 13,10,'Введите знаковое десятичное число со специфика-'

DB 13,10,'тором d в диапазоне от -32768d до 32767d: $'

mes2 DB 13,10,'Ошибка ввода: переполнение или недопустимый символ $'

mes3 DB 13,10,'Преобразованное двоичное число в дополнительном коде:$'

mes4 DB 13,10,'Восстановленное из двоичного кода десятичное число: $'

mes5 DB 13,10,'Продолжаем работу <F1>, или выходим <F10>? $'

Codeseg

extrn ASCIIdec_bin:proc, Bin_ASCIIbin:proc, Bin_ASCIIdec:proc

Start: mov ax,@data ;Установка в ds адреса

mov ds,ax ;сегмента данных

call screen ;Очистка экрана с установкой курсора

;в левый верхний угол (см. лаб. раб. №3)

Again: out_str$ mes1 ;Вывод сообщения mes1

call ASCIIdec_bin ;Ввод десятичного числа с последующим преобразо-

;ванием его в двоичный дополнительный код

jc Abort ;Допущена ошибка при вводе?

call Bin_ASCIIbin ;Нет. Преобразовать двоичный код в ASCII- строку ;из двоичных цифр

out_str$ mes3 ;Вывод сообщения mes3

out_buf Bin_buf,16 ;Вывод на экран двоичного кода введённого числа

call Bin_ASCIIdec ;Преобразовать двоичный код в ASCII- строку из ;десятичных цифр

out_str$ mes4 ;Вывод сообщения mes4

out_buf Dec_buf,7 ;Вывод на экран восстановленного из двоичного кода ;десятичного числа

;Блок управления программой. Продолжение работы – <F1>, выход -<F10>.

…………………

Exit mov ax,4C00h ;Функция DOS 4Сh: выход из программы

int 21h ;Вызов DOS. Останов

Abort: out_str$ mes2 ;Вывод сообщения mes2

jmp Again ;Повторим ввод

END Start ;Конец программы/точка входа

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]