Главная » Все файлы » Просмотр файлов из архивов » PDF-файлы » 10_Модульное программирование

10_Модульное программирование (В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования), страница 3

PDF-файл 10_Модульное программирование (В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования), страница 3 Практика расчётов на ПЭВМ (37023): Книга - 1 семестр10_Модульное программирование (В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования) - PDF, страница 3 (37023) - СтудИзба2019-04-28СтудИзба

Описание файла

Файл "10_Модульное программирование" внутри архива находится в папке "В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования". PDF-файл из архива "В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования", который расположен в категории "". Всё это находится в предмете "практика расчётов на пэвм" из 1 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Просмотр PDF-файла онлайн

Текст 3 страницы из PDF

Суммируемый массив знаковых чисел расположен в сегменте данных головного модуля и имеет общедоступное имя A. Длина массива является общедоступной константой с именем N,также описанной в головном модуле. Вычисленная сумма массива помещается в общедоступную переменную с именем Summa, описанную во втором модуле. Всё это примеры статических связеймежду модулями по данным.

Наша программа не содержит динамических связей по данным, в качестве примера такой связи можно привести передачу параметра по ссылке в процедуру другого модуля. Действительно, адрес переданной по ссылке переменной становится известным вызваннойпроцедуре только во время счёта программы, когда он передан ей основной программой (обычно встеке).В том случае, если при суммировании массива обнаружена ошибка (переполнение), второй модуль передаёт управление на общедоступную метку с именем Error, описанную в головном модуле. Остальные имена являются локальными в модулях, например, обратите внимание, что в обоихмодулях используются две метки с одинаковым именем L.Здесь необходимо отметить важную особенность использования внешних адресов. Рассмотрим,например, командуL:add ax,A[bx]во втором модуле.

При получении из этого предложения языка Ассемблера машинной команды необходимо знать, по какому сегментному регистру осуществляет доступ наш внешний адрес A. На этово втором модуле (а только его и видит во время перевода программа Ассемблера, первый модульнедоступен!) указывает местоположение директивыextrn A:word; Внешняя переменнаяЭта директива располагается в сегменте с именем Data, а директиваassume cs:Code,ds:Dataопределяет, что во время счёта на этот сегмент будет установлен регистр ds.

Следовательно, адрес Aсоответствует области памяти в том сегменте, на который указывает регистр ds. 1 Как видим, директива assume нам здесь снова пригодилась.Продолжим рассмотрение работы нашей модульной программы. Получив управление, процедура Sum сохраняет в стеке используемые регистры (эта часть соглашения о связях у нас выполняется),и накапливает сумму всех элементов массива A в регистре ax. При ошибке переполнения процедуравосстанавливает запомненные значения регистров, удаляет из стека дальний адрес возврата (4 байта)и выполняет команду безусловного перехода на метку Error в головном модуле.

В нашем примеревторой вызов процедуры Sum специально сделан так, чтобы вызвать ошибку переполнения. Заметим,что переход на внешнюю метку Error – это тоже статическая связь по управлению, так как адресметки известен до начала счёта. В то же время возврат из внешней процедуры по команде ret является динамической связью по управлению, так как конкретный адрес возврата в другой модульбудет помещён в стек только во время счёта программы.Программа Ассемблера не в состоянии перевести каждый исходный модуль в готовый к счётуфрагмент программы на машинном языке, так как, во-первых, не может определить внешние адресамодуля, а, во-вторых, не знает будущего расположения сегментов модуля в памяти.

Говорят, что Ассемблер переводит исходный модуль на специальный промежуточный язык, который называется1Иногда в таких случаях говорят, что имя A объявлено в сегменте Data (правда термин "объявить имя"используется в основном в языках высокого уровня). Объявление имени переменной в некотором сегменте модуля, в отличие от описания этого имени, не требует выделения для переменной памяти в данном сегментеэтого модуля. Для Ассемблера такое объявление переменной является также и указанием (директивой) о том,что во время счёта программы данная переменная будет находиться в памяти именно этого сегмента, как этообеспечивается, мы узнаем несколько позже.7объектным языком.

Следовательно, программа Ассемблер преобразует входной модуль в объектный модуль. Полученный объектный модуль оформляется в виде файла, имя этого файла обычносовпадает с именем исходного файла на языке Ассемблер, но имеет другое расширение. Так, нашиисходные файлы p1.asm и p2.asm будут переводиться (или, как чаще говорят, компилироватьсяили транслироваться) в объектные файлы с именами p1.obj и p2.obj.Рассмотрим теперь, чего не хватает в объектном модуле, чтобы быть готовым к счёту фрагментом программы на машинном языке. Например, самая первая команда всех наших программmov ax,Dataдолжна переводится в машинную команду пересылки формата mov ax,i16 , однако значение константы i16, которая равна физическому адресу начала сегмента Data в памяти, делённому на 16,неизвестна программе Ассемблера, поэтому поле операнда i16 в команде пересылки остаётся незаполненным.

Таким образом, в объектном модуле некоторые адреса остаются неизвестными (неопределёнными). До начала счёта программы, однако, все такие адреса обязательно должны получитьконкретные значения.Объектный модуль, получаемый программой Ассемблера, состоит из двух частей: тела модуляи паспорта (или заголовка) модуля. Тело модуля состоит из сегментов, в которых находятся команды и переменные (области памяти) нашего модуля, а паспорт содержит описание структуры объектного модуля. В этом описании содержатся следующие данные об объектном модуле.• Сведения обо всех сегментах модуля (длина сегмента, его спецификация).• Сведения обо всех общедоступных (экспортируемых) именах модуля, заданных директивами public, с каждым таким именем связан его тип (abs,byte,word,near и т.д.) иадрес (входная точка) внутри какого-либо сегмента модуля (для константы типа abs этоне адрес, а просто целое число – значение этой константы).• Сведения об именах и типах всех внешних адресов модуля, заданных в директивахextrn.• Сведения о местоположении всех остальных незаполненных полей в сегментах модуля,для каждого такого поля задано его месторасположение в сегменте и информация о способе его заполнения перед началом счёта.• Другая информация, необходимая для сборки программы из модулей.p1.objP2.objStk segment stackData segment publicPublic A:wordPublic N:absextrn Summa:wordANSummaCode segment publicExtrn Sum:farPublic Error:nearSumErrorANSummaSumErrorData segment publicextrn A:wordextrn N:abspublic Summa:wordCode segment publicpublic Sum:farextrn Error:nearРис.

10.1. Схематический вид двух объектных модулей свнешними адресами и входными точками.На рис. 10.1 показано схематическое изображение объектных модулей p1.obj и p2.obj, независимо полученных программой Ассемблера, для каждого модуля изображены его сегменты, входные точки и внешние адреса. Вся эта информация содержится в паспортах объектных модулей (напомним, что для простоты изложения мы не принимаем во внимание третий модуль нашей программы с именем ioproc).

11Все имена исходного модуля, кроме внешних имён и имён входных точек, обычно заменяются в объектном модуле их численными значениями. Например, уже на важно, какое имя имела та или иная (локальная)переменная или метка программы, эта информация больше никому не понадобится (исключением являются так8Обратимся теперь к проблеме сборки полной программы из модулей. Как мы уже упоминали,эту работу выполняет специальная системная программа, которая называется редактором внешнихсвязей.

Из этого названия хорошо видно одно из назначений этой программы – редактировать (всмысле устанавливать, настраивать) связи между внешними адресами и входными точками модулей.Рассмотрим схему работы редактора внешних связей на нашем предыдущем примере.10.2. Схема работы редактора внешних связейЦелью работы редактора внешних связей является построение из объектных модулей почти готового к счёту программы, которая называется загрузочным модулем. Загрузочный модуль всё ещёне является полностью готовой к счёту программой на машинном языке, в этом модуле остаются незаполненными некоторые поля.

Например, наша первая команда в головном модулеmov ax,Dataвсё ещё будет иметь незаполненное поле Data формата i16 на месте второго операнда, так как конкретное значение этого поля (адрес сегмента данных) будет известно только перед самым началомсчёта программы, когда все её сегменты будут размещены в памяти компьютера.При вызове редактора внешних связей ему в качестве параметров передаются имена всех объектных модулей, а также имя загрузочного модуля, который необходимо построить.

Для нашегопримера вызов редактора внешних связей (в нашей системе программирования его имя link) будетвыглядеть, например, такlink p1+p2+ioproc,pЗдесь p1,p2 и ioproc – имена объектных модулей (не забывайте о третьем объектном модулес именем ioproc), а p – имя загрузочного модуля, который надо построить. 1 Первый из перечисленных объектных модулей считается головным модулем, с него начинается процесс сборки загрузочного модуля.

Работа редактора внешних связей включает в себя два этапа. На первом этапе происходит обработка сегментов, а на втором – собственно редактирование внешних связей и построение загрузочного модуля (загрузочные модули для нашего компьютера имеют расширение .exe).Разберёмся сначала с первым этапом.В нашем примере (если не принимать во внимание объектный модуль ioproc.obj) имеетсяпять сегментов: три сегмента с именами Stk,Data и Code в модуле p1.obj и два сегмента с именами Data и Code в модуле p2.obj. Спрашивается, сколько сегментов будет в загрузочном модулеp.exe ? Здесь логически возможны три случая.• Все сегменты переходят в загрузочный модуль.

В этом случае в нашем модуле p.exeдолжно было бы быть 5 сегментов: один стековый, два кодовых и два сегмента данных.• Некоторые из сегментов склеиваются, то есть один сегмент присоединяется в конец другого сегмента.• Некоторые из сегментов накладываются друг на друга (если сегменты имеют разнуюдлину, то, конечно, более длинный сегмент будет "торчать" из-под более короткого сегмента). Разумеется, почти всегда накладывать друг на друга имеет смысл только сегментыданных, в этом случае у нескольких модулей будут общие сегменты данных (или, какиногда говорят, общие области (или блоки) данных).Как именно будут обрабатываться сегменты при сборке загрузочного модуля из объектных модулей, определяет сам программист, задавая определённые параметры в директивах segment.Существуют следующие параметры, управляющие обработкой сегментов редактором внешних связей.Параметр public у одноимённых сегментов означает их склеивание.

2 Так как сборка начинается с головного модуля, то из двух одноимённых сегментов с параметром public сегмент из гоназываемые "отладчики в терминах входного языка", но для Ассемблеров они практически не используются имы не будем касаться этой темы).1Если объектных модулей очень много, то существует более компактный способ задать их, не перечисляяих все в строке вызова редактора внешних связей.2Вообще говоря, в нашем языке Ассемблера склеиваемые сегменты должны ещё принадлежать к одномуи тому же классу сегментов. В рассмотренных нами примерах это требование выполняется, а для более полного изучения понятия класса сегмента необходимо обратиться, например, к учебнику [5].9ловного модуля будет первым, в его конец будут добавляться соответствующие одноимённые сегменты из других объектных модулей. В том случае, если одноимённые сегменты с параметром public встречаются не в головном модуле, то их порядок при склейке определяется конкретным редактором внешних связей (надо читать документацию).

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5224
Авторов
на СтудИзбе
428
Средний доход
с одного платного файла
Обучение Подробнее