ВІКІСТОРІНКА
Навигация:
Інформатика
Історія
Автоматизація
Адміністрування
Антропологія
Архітектура
Біологія
Будівництво
Бухгалтерія
Військова наука
Виробництво
Географія
Геологія
Господарство
Демографія
Екологія
Економіка
Електроніка
Енергетика
Журналістика
Кінематографія
Комп'ютеризація
Креслення
Кулінарія
Культура
Культура
Лінгвістика
Література
Лексикологія
Логіка
Маркетинг
Математика
Медицина
Менеджмент
Металургія
Метрологія
Мистецтво
Музика
Наукознавство
Освіта
Охорона Праці
Підприємництво
Педагогіка
Поліграфія
Право
Приладобудування
Програмування
Психологія
Радіозв'язок
Релігія
Риторика
Соціологія
Спорт
Стандартизація
Статистика
Технології
Торгівля
Транспорт
Фізіологія
Фізика
Філософія
Фінанси
Фармакологія


ГЛАВА 4. Ассемблирование и выполнение программ

------------------------------------------------------------ Ассемблирование и выполнение программ Цель: показать процессы ассемблирования, компановки ивыполнения программ. ВВЕДЕНИЕ------------------------------------------------------------ В данной главе объясняется, как ввести в компьютерисходный ассемблерный текст программы, как осуществитьассемблирование, компановку и выполнение программы. Крометого, показана генерация таблицы перекрестных ссылок дляцелей отладки. ВВОД ПРОГРАММЫ------------------------------------------------------------ На рис.3.2. был показан только исходный текст программы,предназначенный для ввода с помощью текстового редактора.Теперь можно использовать DOS EDLIN или другой текстовыйредактор для ввода этой программы. Если вы никогда непользовались программой EDLIN, то именно сейчас необходимовыполнить ряд упражнений из руководства по DOS. Для запускапрограммы EDLIN вставте дискету DOS в дисковод A иформатизованную дискету в дисковод B. Чтобы убедиться вналичии на дискете свободного места для исходного текста,введите CHKDSK B:. Для винчестера во всех следующих примерахследует использовать C: вместо B:. Для ввода исходнойпрограммы EXASM1, наберите команду EDLIN В:EXASM1.ASM [Return] В результате DOS загрузит EDLIN в памяти и появитсясообщение "New file" и приглашение "*-". Введите команду Iдля ввода строк, и затем наберите каждую ассемблернуюкоманду так, как они изобpажены на рис. 3.2. Хотя числопробелов в тексте для ассемблера не существенно, старайтесьзаписывать метки, команды, операнды и комментарии, выровненными в колонки, программа будет более yдобочитаемая. Дляэтого в EDLIN используется табуляция через каждые восемьпозиций. После ввода программы убедитесь в ее правильности. Затемнаберите E (и Return) для завершения EDLIN. Можно проверитьналичие программы в каталоге на диске, введите DIR B: (для всех файлов) или DIR B:EXASM1.ASM (для одного файла) Ассемблер для IBM PC. Глава 4 80 Если предполагается ввод исходного текста большегообъема, то лучшим применением будет полноэкранный редактор.Для получения распечатки программы включите принтер иустановите в него бумагу. Вызовите программу PRINT (для DOS2.0 и старше). DOS загрузит программу в память и распечатаеттекст на принтере: PRINT B:EXASM1.ASM [Return] Программа EXASM.ASM еще не может быть выполнена - прежденеобходимо провести ее ассемблирование и компановку. Вследующем pазделе показана эта же программа послеассемблирования и пояснены этапы ассемблирования и получениялистинга. ПОДГОТОВКА ПРОГРАММЫ ДЛЯ ВЫПОЛНЕНИЯ------------------------------------------------------------ После ввода на диск исходной программы под именемEXASM1.ASM необходимо проделать два основных шага, преждечем программу можно будет выполнить. Сначала необходимоассемблиpовать программу, а затем выполнить компановку.Программисты на языке бейсик могут выполнить программу сразупосле ввода исходного текста, в то время как для ассемблераи компиллярных языков нужны шаги трансляции и компановки. Шаг ассемблирования включает в себя трансляцию исходногокода в машинный объектный код и генерацию OBJ-модуля. Вы ужевстречали примеры машинного кода в главе 2 и примеры исxодного текста в этой главе. OBJ-модуль уже более приближен к исполнительной форме, ноеще не готов к выполнению. Шаг компановки включает преобразование OBJ-модуля в EXE (исполнимый) модуль, содержащиймашинный код. Прогрпмма LINK, находящаяся на диске DOS,выполняет следующее: 1. Завершает формирование в OBJ-модуле адресов, которые остались неопределенными после ассемблирования. Во мно гих следующих программах такие адреса ассемблер отмеча ет как ----R.2. Компанует, если необходимо, более одного отдельно ассем блированного модуля в одну загрузочную (выполнимую) про грамму; возможно две или более ассемблерных программ или ассемблерную программу с программами, написанными на языках высокого уровня, таких как Паскаль или Бейсик.3. Инициализирует EXE-модуль командами загрузки для выполнения. После компановки OBJ-модуля (одного или более) вEXE-модуль, можно выполнить EXE-модуль любое число раз. Но,если необходимо внести некоторые изменения в EXE-модуль,следует скорректировать исходную программу, ассемблироватьее в другой OBJ-модуль и выполнить компановку OBJ-модуля в Ассемблер для IBM PC. Глава 4 81 новый EXE-модуль. Даже, если эти шаги пока остаются непонятными, вы обнаружите, что, получив немного навыка, весьпроцесс подготовки EXE-модуля будет доведен до автоматизма.Заметьте: определенные типы EXE-программ можно преобразоватьв oчень эффективные COM-программы. Предыдущие примеры,однако, не cовсем подходят для этой цели. Данный вопросрассматривается в главе 6. АССЕМБЛИРОВАНИЕ ПРОГРАММЫ------------------------------------------------------------ Для того, чтобы выполнить исходную ассемблерную программу, необходимо прежде провести ее ассемблирование и затемкомпановку. На дискете с ассемблерным пакетом имеются двеверсии aссемблера. ASM.EXE - сокращенная версия с отсутствием некоторых незначительных возможностей и MASM.EXE -полная версия. Если размеры памяти позволяют, то используйтеверсию MASM (подробности см. в соответствующем руководствепо ассемблеру). Для ассемблирования, вставте ассемблерную дискету вдисковод A, а дискету с исходной программой в дисковод B.Кто имеет винчестер могут использовать в следующих примеpахC вместо A и B. Простейший вариант вызова программы это вводкоманды MASM (или ASM), что приведет к загрузке программыассемблера с диска в память. На экране появится: source filename [.ASM]: object filename [filename.OBJ]: source listing [NUL.LST]: cross-reference [NUL.CRF]: Курсор при этом расположится в конце первой строки, гденеобходимо указать имя файла. Введите номер дисковода (еслион не определен умолчанием) и имя файла в следующем виде:B:EXASM1. Не следует набирать тип файла ASM, так как ассемблер подразумевает это. Во-втором запросе предполагается аналогичное имя файла(но можно его заменить). Если необходимо, введите номердисковода B:. Третий запрос предполагает, что листинг ассемблированияпрограммы не требуется. Для получения листинга на дисководеB наберите B: и нажмите Return. Последний запрос предполагает, что листинг перекрестныхcсылок не требуется. Для получения листинга на дисководе B,наберите B: и нажмите Return. Если вы хотите оставить значения по умолчанию, то в трехпоследних запросах просто нажмите Return. Ниже приведенпример запросов и ответов, в результате которых ассемблердолжен cоздать OBJ, LST и CRF-файлы. Введите ответы так, какпоказано, за исключением того, что номер дисковода можетбыть иной. source filename [.ASM]:B:EXASM1 [Return] Ассемблер для IBM PC. Глава 4 82 object filename [filename.OBJ]:B: [Return] source listing [NUL.LST]:B: [Return] cross-reference [NUL.CRF]:B: [Return] Всегда необходимо вводить имя исходного файла и, обычно,запрашивать OBJ-файл - это требуется для компановкипрограммы в загрузочный файл. Возможно потребуется указаниеLST-файла, особенно, если необходимо проверить сгенерированный машинный код. CRF-файл полезен для очень большихпрограмм, где необходимо видеть, какие команды ссылаются накакие поля данных. Кроме того, ассемблер генерирует вLST-файле номера строк, которые используются в CRF-файле. В приложении 4 "Режимы ассемблирования и редактирования"перечислены режимы (опции) для ассемблера версий 1.0 и 2.0. Ассемблер преобразует исходные команды в машинный код ивыдает на экран сообщения о возможных ошибках. Типичнымиошибками являются нарушения ассемблерных соглашений поименам, неправильное написание команд (например, MOVE вместоMOV), а также наличие в опеpандах неопределенных имен.Программа ASM вадает только коды ошибок, которые объяснены вруководстве по ассемблеру, в то время как программа МASMвыдает и коды ошибок, и пояснения к ним. Всего имеется около100 сообщений об ошибках. Ассемблер делает попытки скорректировать некоторыеошибки, но в любом случае следует перезагрузить текстовыйредактор, исправить исходную программу (EXASM1.ASM) иповторить ассемблирование. На рис. 4.1. показан листинг, полученный в результатеасcемблирования программы и записанный на диск под именемEXASM1.LST. В начале листинга обратите внимание на реакцию ассемблерана директивы PAGE и TITLE. Никакие директивы, включаяSEGMENT, PROC, ASSUME и END не генерируют машинных кодов. Листинг содержит не только исходный текст, но также слеватранслированный машинный код в шестнадцатиричном формате. Всамой левой колонке находится шест.адреса команд и данных. Сегмент стека начинается с относительного адреса 0000. Вдействительности он загружается в память в соответствии садpесом в регистре SS и нулевым смещением относительно этогоадpеса. Директива SEGMENT устанавливает 16-кратный адрес иуказывает ассемблеру, что это есть начало стека. Самадиректива не генерирует машинный код. Команда DB, такженаходится по адресу 0000, содержит 12 копий слова'STACKSEG'; машинный код представлен шест.0C (десятичное 12)и шест. представлением ASCII символов. (В дальнейшем можноиспользовать отладчик для просмотра результатов в памяти).Сегмент стека заканчивается по адресу шест. 0060, которыйэквивалентен десятичному значению 96 (12х8). ------------------------------------------------------------------------------------------------------------------------ Рис. 4.1. Листинг ассемблирования программы Ассемблер для IBM PC. Глава 4 83 Сегмент кода также начинается с относительного адреса0000. Он загружается в память в соответствии с адресом вpегистре CS и нулевым смещением относительно этого адреса.Поскольку ASSUME является директивой ассемблеру, то перваякоманда, которая генерирует действительный машинный код естьPUSH DS - однобайтовая команда (1E), находящаяся на нулевомсмещении. Следующая команда SUB AX,AX генерирует двухбайтовый машинный код (2B C0), начинающийся с относительногоадреса 0001. Пробел между байтами только для удобочитаемости. В данном примере встречаются одно-, двух- и трехбайтовыекоманды. Последняя команда END содержит операнд BEGIN, которыйимеeт отношение к имени команды PROC по смещению 0000. Этоесть адрес сегмента кодов, с которого начинается выполнениепосле загрузки программы. Листинг ассемблирования программы EXASM1.LST, имеет подирективе PAGE шиpину 132 символа и может быть распечатан.Многие принтеры могут печатать текст сжатым шрифтом.Включите ваш принтер и введите команду MODE LPT1:132,6 Таблица идентификаторов За листингом ассемблирования программы следует таблицаидентификаторов. Первая часть таблицы содержит определенныев программе сегменты и группы вместе с их размером в байтах,выравниванием и классом. Вторая часть содержит идентификаторы - имена полей данных в сегменте данных (в нашем примереих нет) и метки, назначенные командам в сегменте кодов (однав нашем примере). Для того, чтобы ассемблер не создавал этутаблицу, следует указать параметр /N вслед за командой MASM,т.е. MASM/N. Двухпроходный ассемблер В процессе трансляции исходной программы ассемблерделает два просмотра исходного текста, или два прохода.Одной из основных причин этого являются ссылки вперед, чтопроисходит в том случае, когда в некоторой команде кодируется метка, значение которой еще не определено ассемблером. В первом проходе ассемблер просматривает всю исходнуюпрогpамму и строит таблицу идентификаторов, используемых впрограмме, т.е. имен полей данных и меток программы и ихотносительных aдресов в программе. В первом проходеподчитывается объем объектного кода, но сам объектный код негенерируется. Во втором проходе ассемблер использует таблицу идентификаторов, построенную в первом проходе. Так как теперь ужеизвестны длины и относительные адреса всех полей данных икоманд, то ассемблер может сгенерировать объектный код длякаждой команды. Ассемблер создает, если требуется, файлы:OBJ, LST и CRF. Ассемблер для IBM PC. Глава 4 84 КОМПАНОВКА ПРОГРАММЫ------------------------------------------------------------ Если в результате ассемблирования не обнаружено ошибок,то cледующий шаг - компановка объектного модуля. ФайлEXASM1.OBJ содержит только машинный код в шестнадцатеричнойформе. Так как программа может загружаться почти в любоеместо памяти для выполнения, то ассемблер может неопределить все машинные адреса. Кроме того, могутиспользоваться другие (под) программы для объединения сосновной. Назначением программы LINK является завершениеопределения адресных ссылок и объединение (если требуется)нескольких программ. Для компановки ассемблированной программы с дискеты,вставте дискету DOS в дисковод A, а дискету с программой вдисковод B. Пользователи винчестерского диска могутзагрузить компановщик LINK прямо с дисковода C. Введитекоманду LINK и нажмите клавишу Return. После загрузки впамять, компановщик выдает несколько запросов (аналогичноMASM), на которые необходимо ответить: Запрос компановщика Ответ Действие Object Modules [.OBJ]: B:EXASM1 Компанует EXASM1.OBJ Run file [EXASM1.EXE]: B: Создает EXASM1.EXE List file [NUL.MAP]: CON Создает EXASM1.MAP Libraries [.LIB]: [Return] По умолчанию Первый запрос - запрос имен объектных модулей для компановки, тип OBJ можно опустить. Второй запрос - запрос имени исполнимого модуля (файла),(по умолчанию A:EXASM1.EXE). Ответ B: требует, чтобыкомпановщик создал файл на дисководе В. Практика сохраненияодного имени (при разных типах) файла упрощает работу спрограммами. Третий запрос предполагает, что LINK выбирает значение поyмолчанию - NUL.MAP (т.е. MAP отсутствует). MAP-файлсодержит таблицу имен и размеров сегментов и ошибки, которыеобнаружит LINK. Типичной ошибкой является неправильноеопределение сегмента стека. Ответ CON предполагает, чтотаблица будет выведена на экран, вместо записи ее на диск.Это позволяет сэкономить место в дисковой памяти и сразупросмотреть таблицу непосредственно на экране. В нашемпримере MAP-файл содержит следующую информацию: Start Stop Length Name 00000H 00015H 0016H CODESG 00020H 0007FH 0060H STACKSG Ассемблер для IBM PC. Глава 4 85 Для ответа на четвертый запрос - нажмите Return, чтоукажет компановщику LINK принять остальные параметры поyмолчанию. Описание библиотечных средств можно найти вруководстве по DOS. На данном этапе единственной возможной ошибкой может бытьyказание неправильных имен файлов. Исправить это можнотолько перезапуском программы LINK. В приложении 4 перечислен ряд pежимов компановщика LINK. ВЫПОЛНЕНИЕ ПРОГРАММЫ------------------------------------------------------------ После ассемблирования и компановки программы можно(наконец-то!) выполнить ее. На рис. 4.2 приведена схемакоманд и шагов для ассемблирования, компановки и выполненияпрограммы EXASM1. Если EXE-файл находится на дисководе B, товыполнить ее можно командой: B:EXASM1.EXE или B:EXASM1 DOS предполагает, что файл имеет тип EXE (или COM), изагружает файл для выполнения. Но так как наша программа невырабатывает видимых результатов, выполним ее трассировкойпод отладчиком DEBUG. Введите DEBUG B:EXASM1.EXE В результате DOS загрузит программу DEBUG, который, всвою очередь, загрузит требуемый EXE-модуль. После этогоотладчик выдаст дефис (-) в качестве приглашения. Дляпросмотра сегмента стека введите D SS:0 Эту область легко узнать по 12-кратному дублированиюконстанты STACKSEG. Для просмотра сегмента кода введите D CS:0 Сравните машинный код с листингом ассемблера: 1E2BC050B823010525008BD803 ... Непосредственные операнды, приведенные в листингеассемблирования как 0123 и 0025 в памяти представлены в виде2301 и 2500 соответственно. В данном случае листингассемблирования не вполне соответствует машинному коду. Вседвухбайтовые адреса (слова) и непосредственные операнды вмашинном коде хранятся в обратном порядке. Ассемблер для IBM PC. Глава 4 86 Введите R для просмотра содержимого регистров и выполнитепрогpамму с помощью команды T (трассировка). Обратитевнимание на воздействие двух команд PUSH на стек - в вершинестека теперь находится содержимое регистра DS и нулевойадрес. В процессе пошагового выполнения программы обратитевнимание на содержимое регистров. Когда вы дойдете докоманды RET, можно ввести Q (Quit - выход) для завершенияработы отладчика. Используя команду dir, можно проверить наличие вашихфайлов на диске: DIR B:EXASM1.* ------------------------------------------------------------------------------------------------------------------------ Рис. 4.2. Схема ассемблирования, компановки и выполнения программы. В результате на экране появится следующие имена файлов:EXASM1.BAK (если для корректировки EXASM1.ASM использовалсяредактор EDLIN), EXASM1.ASM, EXASM1.OBJ, EXASM1.LST,EXASM1.EXE и EXASM1.CRF. Последовательность этих файловможет быть иной в зависимости от того, что уже находится надиске. Очевидно, что разработка ряда программ приведет к занятиюдискового пространства. Для проверки оставшегося свободногоместа на диске полезно использовать команду DOS CHKDSK. Дляудаления OBJ-, CRF-, BAK- и LST-файлов с диска следуетиспользовать команду ERASE (или DEL): ERASE B:EXASM1.OBJ, ... Следует оставить (сохранить) ASM-файл для последующихизменений и EXE-файл для выполнения. В следующем разделе представлено определение данных всегменте данных. Позже будет описана таблица перекрестныхcсылок. ПРИМЕР ИСХОДНОЙ ПРОГРАММЫ------------------------------------------------------------ Особенность программы, приведенной на рис. 4.1, состоит втом, что она не содержит определения данных. Обычно всепрограммы имеют определенные константы, рабочие поля дляарифметических вычислений и области для операцийввода-вывода. В главе 2 (рис.2.3) была рассмотрена программа в машинныхкодах, в которой были определены два поля данных. В этойглаве на рис. 4.3 приводится аналогичная программа, но наэтот раз написанная на языке ассемблера и для краткости ужеассемблированная. Эта программа знакомит с несколькиминовыми особенностями. Ассемблер для IBM PC. Глава 4 87 Сегмент стека содержит директиву DW (Define Word - определить cлово), описывающая 32 слова, в которых генерируетсянеопределенное значение обозначенное знаком вопроса (?).Определение размера стека в 32 слова является наиболеереальным, так как в больших программах может потребоватьсямного "прерываний" для ввода-вывода и вызовов подпрограмм -все они используют стек. Определение стека дублированиемконстанты 'STACKSEG' в примере на pис. 3.2 необходимо лишьдля удобства при работе с отладчиком DEBUG. Замечание: Определяйте размер стека не менее 32 слов. Прималых размерах стека ни ассемблер, ни компановщик не смо-гут определить этого и выполнение программы может разрушиться самым непредсказуемым образом. В примере на рис. 4.3 определен сегмент данных DATASG,начинающийся по относительному адресу 0000. Этот сегментсодержит три значения в формате DW. Поле FLDA определяетслово (два байта), содержащее десятичное значение 250,которое ассемблер транслирует в шест. 00FA (см. на рисункеслева). Поле FLDB определяет слово с десятичным значением 125,котоpое транслируется в шест. 007D. Действительные значенияэтих двух констант в памяти - FA00 и 7D00 соответственно,что можно проверить c помощью отладчика DEBUG. ------------------------------------------------------------------------------------------------------------------------ Рис. 4.3. Листинг ассемблирования программы с сегментом данных. Поле FLDC определяет слово с неизвестным значением,обозначенным знаком вопроса (?). Сегмент кода в данном примере имеет имя CODESG и отли-чается новыми особенностями, связанными с сегментом данных.Во-первых, директива ASSUME указывает на определние DATASGчерез регистр DS. Данной программе не требуется регистр ES,но некоторые программисты описывают его для стандартизации.Во-вторых, после команд PUSH, SUB и PUSH, которые инициали-зируют стек, следуют две команды, обеспечивающие адресациюсегмента данных: 0004 B8 ---- R MOV AX,DATASG 0007 8E D8 MOV DS,AX Первая команда MOV загружает DATASG в регистр AX.Конечно, на самом деле команда не может загрузить сегмент врегистр - она загружает лишь адрес сегмента DATASG. Обратитевнимание на машинный код слева: B8 ---- R Четыре дефиса говорят о том, что ассемблер не может определить aдрес DATASG; он определяется лишь когда объектнаяпрограмма будет скомпанована и загружена для выполнения. Ассемблер для IBM PC. Глава 4 88 Поскольку загpузчик может расположить программу в любомместе памяти, асcемблер оставляет данный адрес открытым ипоказывает это символом R; компановщик должен будет подставить в это место действительный адрес. Вторая команда MOV пересылает содержимое регистра AX врегистр DS. Таким образом, данная программа имеет директивуASSUME, которая соотносит регистр DS с сегментом данных, икоманды, инициализирующие регистр DS относительным адресомDATASG. Могут возникнуть два вопроса по поводу этой программы.Во-первых, почему не использовать одну команду для инициализации регистра DS, например, MOV DS,DATASG ? Дело в том, что не существует команд для непосредственнойпереcылки данных из памяти в регистр DS. Следовательно, дляинициализации DS необходимо кодировать две команды. Во-вторых, почему программа инициализирует регистр DS, арегистры SS и CS нет? Оказывается, регистры SS и CSинициализируются автоматически при загрузке программы длявыполнения, а ответственность за инициализацию регистра DSи, если требуется ES, лежит полностью на самой программе. Пока все эти требования могут показаться весьма туманными, но cейчас нет необходимости понимать их. Все последующие программы используют аналогичную стандартную инициализацию стека и сегмента данных. Поэтому можно просто копироватьданные коды для каждой новой программы. Действительно, выможете сохранить на диске стандартную часть программы и длякаждой новой программы копировать эту часть с новым именем,и, используя затем редактор, записать дополнительныекоманды. В качестве упражнения, создайте с помощью вашегоредактора программу, приведенную на рис. 4.3, выполните ееассемблирование и компановку. Затем с помощью отладчикаDEBUG просмотрите сегмент кодов, сегмент данных, регистры ипроделайте пошаговое выполнение программы. ФАЙЛ ПЕРЕКРЕСТНЫХ ССЫЛОК------------------------------------------------------------ В процессе трансляции ассемблер создает таблицуидентификаторов (CRF), которая может быть представлена ввиде листинга перекрестных ссылок на метки, идентификаторыи переменные в программе. Для получения данного фала,необходимо на четвертый запрос ассемблера, oтветить B:,полагая, что файл должен быть создан на диске B: cross-reference [NUL.CRF]:B: [Return] Ассемблер для IBM PC. Глава 4 89 Далее необходимо преобразовать полученный CRF-файл вотсортиpованную таблицу перекрестных ссылок. Для этого наассемблерном диске имеется соответствующая программа. Послеуспешного ассемблирования введите команду CREF. На экранепоявится два запроса: Cref filename [.CRF]: List filename [cross-ref.REF]: На первый запрос введите имя CRF-файла, т.е. B:EXASM1. Навторой запрос можно ввести только номер дисковода и получитьимя по умолчанию. Такой выбор приведет к записи CRF в файлперекрестных ссылок по имени EXASM1.REF на дисководе B. Для распечатки файла перекрестных ссылок используйтекоманду DOS PRINT. В приложении 4 приведен ряд режимовпрограммы CREF. ------------------------------------------------------------------------------------------------------------------------ Рис. 4.4. Таблица перекрестных ссылок На рис. 4.4 показана таблица перекрестных ссылок дляпрограммы, приведенной на рис. 4.3. Все идентификаторы втаблице предcтавлены в алфавитном порядке и для каждого изних указаны номеpа строк в исходной программе, где ониопределены и имеют ссылки. Имена сегментов и элементовданных представлены в алфавитном поpядке. Первое числосправа в формате n# указывает на номер строки в LST-файле,где определен соответствующий идентификатор. Еще правеенаходятся числа, указывающие на номера строк, где имеютсяcсылки на этот идентификатор. Например, CODESG определен встроке 17 и имеет ссылки на строках 19 и 32. ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ------------------------------------------------------------ ъ Ассемблер преобразует исходную программу в OBJ-файл, а компановщик - OBJ-файл в загрузочный EXE-файл.ъ Внимательно проверяйте запросы и ответы на них для программ (M)ASM, LINK и CREF прежде чем нажать клавишу Return. Будьте особенно внимательны при указании диско вода.ъ Программа CREF создает распечатку перекрестных ссылок.ъ Удаляйте ненужные файлы с вашего диска. Регулярно пользуйтесь программой CHKDSK для проверки свободного места на диске. Кроме того периодически создавайте резервные копии вашей программы, храните резервную дискету и копируйте ее заново для последующего программирования. ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ------------------------------------------------------------ Ассемблер для IBM PC. Глава 4 90 4.1. Введите команду MASM и ответьте на запросы для ассемблирования программы по имени TEMPY.ASM с получением файлов LST, OBJ и CRF, полагая, что дискета с программой находится на дисководе B. 4.2. Введите команды для программы TEMPY (из вопроса 4.1) а) для выполнения через отладчик DEBUG, б) для непосредст венного выполнения из DOS. 4.3. Объясните назначение каждого из следующих файлов: а) file.BAK, б) file.ASM, в) file.LST, г) file.CRF, д) file.OBJ, е) file.EXE, ж) file.MAP. 4.4. Напишите две команды для инициализации регистра DS, полагая, что имя сегмента данных - DATSEG. 4.5. Составте ассемблерную программу для: - пересылки шест. 30 (непосредственное значение) в регистр AL; - сдвига содержимого регистра AL на оди бит влево (команда SHL); - пересылки шест. 18 (непосредственное значение) в регистр BL; - умножения регистра AL на BL (команда MUL BL). Не забывайте команду RET. В программе нет необходимости определять и инициализировать сегмент данных. Не забы вайте также копировать стандартную часть программы (ос нову программы) и использовать редактор для ее разви тия. Выполните ассемблирование и компановку. Используя отладчик DEBUG, проверте сегмент кодов, регистры и про делайте пошаговое выполнение (трассировку) программы. 4.6. Модифицируйте программу из вопроса 4.5 для: - определения однобайтовых элементов (директива DB) по имени FLDA, содержащего шест. 28, и по имени FLDB, содержащего шест. 14; - определения двухбайтового элемента (директива DW) по имени FLDC, не имеющего значения; - пересылки содержимого поля FLDA в регистр AL и сдвига на один бит; - умножения содержимого регистра AL на значение в поле FLDB (MUL FLDB); - пересылки результата из регистра AX в поле FLDC. Для данной программы необходим сегмент данных. Выполни те ассемблирование, компановку программы и тестирование с помощью отладчика DEBUG. Ассемблер для IBM PC. Глава 5 104

ГЛАВА 5. Определение Данных

------------------------------------------------------------ Определение Данных Цель: Показать методам определения констант и рабочих полейв ассемблерной программе. ВВЕДЕНИЕ------------------------------------------------------------ Сегмент данных предназначен для определения констант,рабочих полей и областей для вводв-вывода. В соответствиис имеющимися директивами в ассемблере разрешено определениеданных различной длины: например, директива DB определяетбайт, а директива DW oпределяет слово. Элемент данных можетсодержать непосредственное значение или константу, определенную как символьная строка или как числовое значение. Другим способом определения константы является непосредственное значение, т.е. указанное прямо в ассемблернойкоманде, например: MOV AL,20H В этом случае шестнадцатеричное число 20 становитсячастью ма шинного объектного кода. Непосредственное значениеограничено oдним байтом или одним словом, но там, где ономожет быть применено, оно является более эффективным, чемиспользование конcтанты. ДИРЕКТИВЫ ОПРЕДЕЛЕНИЯ ДАННЫХ------------------------------------------------------------ Ассемблер обеспечивает два способа определения данных:во-первых, через указание длины данных и, во-вторых, по ихcодержимому. Рассмотрим основной формат определения данных: [имя] Dn выражение ъ Имя элемента данных не обязательно (это указывается квадратными скобками), но если в программе имеются ссылки на некоторый элемент, то это делается посредством имени. Правила написания имен приведены в разделе "Формат кодирования" в главе 3.ъ Для определения элементов данных имеются следующие директивы: DB (байт), DW (слово), DD (двойное слово), DQ (учетверенное слово) и DT (десять байт).ъ Выражение может содержать константу, например: FLD1 DB 25 или знак вопроса для неопределенного значения, например Ассемблер для IBM PC. Глава 5 105 FLDB DB ? Выражение может содержать несколько констант, разделенныхзапятыми и ограниченными только длиной строки: FLD3 DB 11, 12, 13, 14, 15, 16, ... Ассемблер определяет эти константы в виде последовательностиcмежных байт. Ссылка по имени FLD3 указывает на первуюконстанту, 11, по FLD3+1 - на вторую, 12. (FLD3 можнопредставить как FLD3+0). Например команда MOV AL,FLD3+3 загружает в регистр AL значение 14 (шест. 0E). Выражениедопускает также повторение константы в следующем формате: [имя] Dn число-повторений DUP (выражение) ... Следующие три примера иллюстрируют повторение: DW 10 DUP(?) ;Десять неопределенных слов DB 5 DUP(14) ;Пять байт, содержащих шест.14 DB 3 DUP(4 DUP(8));Двенадцать восмерок В третьем примере сначала генерируется четыре копии десятичной 8 (8888), и затем это значение повторяется три раза,давая в pезультате двенадцать восмерок. Выражение может содержать символьную строку или числовуюконстанту. Символьные строки Символьная строка используются для описания данных,таких как, например, имена людей или заголовки страниц.Содержимое строки oтмечается одиночными кавычками,например, 'PC' или двойными кавычками - "PC". Ассемблерпереводит символьные строки в объектный код в обычномформате ASCII. Символьная строка определяется только директивой DB, вкотоpой указывается более двух символов в нормальной последовательности слева направо. Следовательно, директива DBпредставляет единственно возможный формат для определениясимвольных данных. На рис. 5.1 приведен ряд примеров. ------------------------------------------------------------------------------------------------------------------------ Рис. 5.1. Определение символьных строк и числовых величин. Числовые константы Ассемблер для IBM PC. Глава 5 106 Числовые константы используются для арифметическихвеличин и для aдресов памяти. Для описания константы кавычкине ставятся. Ассемблер преобразует все числовые константы вшестнадцитеричные и записывает байты в объектном коде вобратной последовательности - справа налево. Ниже показаныразличные числовые форматы. Десятичный формат. Десятичный формат допускает десятичныецифры от 0 до 9 и обозначается последней буквой D, которуюможно не указывать, например, 125 или 125D. Несмотря на то,что ассемблер позволяет кодирование в десятичном формате,он преобразует эти значения в шест. объектный код.Например, десятичное число 125 преобразуется в шест. 7D. Шестнадцатиричный формат. Шест. формат допускает шест.цифры от 0 до F и обозначается последней буквой H. Так какассемблер полагает, что с буквы начинаются идентификаторы,то первой цифрой шест. константы должна быть цифра от 0 до9. Например, 2EH или 0FFFH, которые ассемблер преобразуетсоответственно в 2E и FF0F (байты во втором примере записываются в объектный код в обратной последовательности). Двоичный формат. Двоичный формат допускает двоичные цифры0 и 1 и обозначается последней буквой B. Двоичный форматобычно используется для более четкого представления битовыхзначений в логических командах AND, OR, XOR и TEST.Десятичное 12, шест. C и двоичное 1100B все генерируют одини тот же код: шест. 0C или двоичное 0000 1100 в зависимостиот того, как вы рассматриваете содержимое байта. Восмеричный формат. Восмеричный формат допускает восмеричные цифры от 0 до 7 и обозначается последней буквой Q или O,например, 253Q. На сегодня восмеричный формат используетсявесьма редко. Десятичный формат с плавающей точкой. Этот формат поддерживается только ассемблером МASM. При записи символьных и числовых констант следуетпомнить, что, например, символьная константа, определеннаякак DB '12', представляет символы ASCII и генерирует шест.3132, а числовая константа, oпределенная как DB 12, представляет двоичное число и генерирует шест. 0C. Рис. 5.1 иллюстрирует директивы для определения различныхсимвольных строк и числовых констант. Сегмент данных былассемблирован для того, чтобы показать сгенерированныйобъектный код (слева). ДИРЕКТИВА ОПРЕДЕЛЕНИЯ БАЙТА (DB)------------------------------------------------------------ Ассемблер для IBM PC. Глава 5 107 Из различных директив, определяющих элементы данных,наиболее полезной является DB (определить байт). Символьноевыражение в диpективе DB может содержать строку символовлюбой длины, вплоть до конца строки (см. FLD2DB и FLD7DB нарис. 5.1). Обратите внимание, что константа FLD2DB содержитсимвольную строку 'Personal Computer'. Объектный кодпоказывает символы кода ASCII для каждого байта. Шест. 20представляет символ пробела. Числовое выражение в директиве DB может содержать однуили более однобайтовых констант. Один байт выражается двумяшест. цифpами. Наибольшее положительное шест. число в одномбайте это 7F, все "большие" числа от 80 до FF представляютотрицательные значения. В десятичном исчислении эти пределывыражаются числами +127 и -128. В примере на рис. 5.1 числовыми константами являютсяFLD3DB, FLD4DB, FLD5DB и FLD8DB. Поле FLD6DB представляетсмесь из числовых и строковых констант, используемых дляпостроения таблицы. ДИРЕКТИВА ОПРЕДЕЛЕНИЯ СЛОВА (DW)------------------------------------------------------------ Директива DW определяет элементы, которые имеют длину водно слово (два байта). Символьное выражение в DW ограниченодвумя символами, которые ассемблер представляет в объектномкоде так, что, например, 'PC' становится 'CP'. Дляопределения символьных строк директива DW имеет ограниченноеприменение. Числовое выражение в DW может содержать одно или болеедвухбайтовых констант. Два байта представляются четырьмяшест. цифрами. Наибольшее положительное шест. число в двухбайтах это 7FFF; все "большие" числа от 8000 до FFFFпредставляют отрицательные значения. В десятичном исчисленииэти пределы выражаются числами +32767 и -32768. В примере на рис. 5.1 поля FLD1DW и FLD2DW определяютчисловые константы. Поле FLD3DW определяет адрес - в данномслучае смещение на адрес FLD7DB. В результате генерируетсяобъектный код 0021 (R обозначает перемещаемость). Проверяявыше по рисунку, видно, что относительный адрес поля FLD7DBдействительно 0021. Поле FLD4DW определяет таблицу из пяти числовых констант.Заметим, что объектный код для каждой константы имеет длинув oдно слово (два байта). Для форматов директив DW, DD и DQ ассемблер преобразуетконстанты в шест. объектный код, но записывает его вобратной последовательности. Таким образом десятичноезначение 12345 преобразуется в шест.3039, но записывается вобъектном коде как 3930. ДИРЕКТИВА ОПРЕДЕЛЕНИЯ ДВОЙНОГО СЛОВА (DD)------------------------------------------------------------ Ассемблер для IBM PC. Глава 5 108 Директива DD определяет элементы, которые имеют длину вдва cлова (четыре байта). Числовое выражение можетсодержать одну или более констант, каждая из которых имеетмаксимум четыре байта (восемь шест. цифр). Наибольшееположительное шест. число в четырех байтых это 7FFFFFFF; все"большие" числа от 80000000 до FFFFFFFF представляютотрицательные значения. В десятичном исчислении эти пределывыражаются числами +2147483647 и -2147483648. В примере на рис. 5.1 поле FLD3DD определяет числовуюконстанту. В поле FLD4DD генерируется разница между двумяадресами, в данном случае результатом является длина поляFLD2DB. Поле FLD5DD определяет две числовые константы. Ассемблер преобразует все числовые константы в директивеDD в шест. представление, но записывает объектный код вобратной последовательности. Таким образом десятичноезначение 12345 преобразуется в шест. 00003039, нозаписывается в oбъектном коде как 39300000. Символьное выражение директивы DD ограничено двумясимволами. Ассемблер преобразует символы и выравнивает ихслева в четырехбайтовом двойном слове, как показано в полеFLD2DD в объектном коде. ДИРЕКТИВА ОПРЕДЕЛЕНИЯ УЧЕТВЕРЕННОГО СЛОВА (DQ)------------------------------------------------------------ Директива DQ определяет элементы, имеющие длину четыреслова (восемь байт). Числовое выражение может содержать однуили более констант, каждая из которых имеет максимумвосемь байт или 16 шест.цифр. Наибольшее положительное шест.число - это семерка и 15 цифр F. Для получения представленияо величине этого числа, покажем, что шест. 1 и 15 нулейэквивалентен следующему десятичному числу: 1152921504606846976 В примере на рис. 5.1 поля FLD2DQ и FLD3DQ иллюстрируютчисловые значения. Ассемблер преобразует все числовые константы в директиве DQ в шест. представление, но записываетобъектный код в обратной последовательности, как и в дирек-тивах DD и DW. Обработка ассемблером символьных строк в директиве DQaналогично директивам DD и DW. ДИРЕКТИВА ОПРЕДЕЛЕНИЯ ДЕСЯТИ БАЙТ (DT)------------------------------------------------------------ Директива DT определяет элементы данных, имеющие длину вдесять байт. Назначение этой директивы связано с"упакованными десятичными" числовыми величинами (см. гл.13).По директиве DT генерируются различные константы, взависимости от версии ассемблера; для практическогоприменения ознакомьтесь с руководством по вашему aссемблера. Ассемблер для IBM PC. Глава 5 109 На рис. 5.1 приведены примеры директивы DT длянеопределенного элемента и для двухсимвольной константы. Программа на рис.5.1 содержит только сегмент данных. Xотяасcемблер не выдает сообщений об ошибках, в таблице LINK MAPпоявится предупреждение: "Warning: No STACK Segment", акомпановщик LINK выдаст "There were 1 errors detected"(Обнаружена 1 ошибка). Несмотря на это предупреждениеможно использовать отладчик DEBUG для просмотра объектногокода, как показано на рис. 5.2. Правая сторона дампа отчетливо показывает символьныеданные, как, например, "Personal Computer". НЕПОСРЕДСТВЕННЫЕ ОПЕРАНДЫ------------------------------------------------------------ На рис. 2.1 в главе 2 было показано использованиенепосредственных операндов. Команда MOV AX,0123H пересылает непосредственную шест. константу 0123 в регистрAX. Трех

© 2013 wikipage.com.ua - Дякуємо за посилання на wikipage.com.ua | Контакти