Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Options, sources, object, list, xrefСтр 1 из 4Следующая ⇒
Планы лабораторных занятий
ЛАБОРАТОРНАЯ РАБОТА 1 – Выполнение п ростых задач
Цель работы: изучить процессы ассемблирования, компоновки и выполнения программы, а также – научиться решать, тестировать и отлаживать на ЭВМ простейшие типовые задачи как вычислительного, так и не вычислительного характера. Как правило, в самой постановке такой задачи уже определен алгоритм ее решения. Необходимо записать этот алгоритм, используя основные конструкции языка ассемблера. Для проверки правильности работы программы должны быть представлены необходимые тестовые данные.
Методические рекомендации по выполнению лабораторной работы При составлении программы на языке ассемблера можно выделить следующие этапы: 1) составление блок – схемы; 2) создание исходной программы NAME.ASM, где NAME – любое допустимое в С имя DOS файла; 3) создание объектной программы NAME.OBJ; 4) создание исполняемой программы NAME.EXE; 5) выполнение EXE – программы; 6) проверка результатов. Если результаты не соответствуют требованиям задачи, надо найти ошибки, т.е. отладить программу. Исходный текст программы создается в любом редакторе текстов. Редактор текста представляет собой программу, которая обеспечивает ввод и корректировку исходных текстов программ в кодах ASCII. Транслятор (компилятор) формирует дисковый файл, содержащий объектный модуль NAME.OBJ (текст программы на машинном языке, но без реализации связей между подпрограммами). Компоновщик (загрузчик) осуществляет компоновку результирующих модулей с предполагаемыми библиотечными модулями и завершает определение адресных ссылок, т.е. создает перемещаемый исполняемый модуль NAME.EXE. Представленный здесь Турбо Ассемблер, включающий встроенные компилятор, компоновщик и отладчик, разработан фирмой Borland International для семейства микрокомпьютеров IBM PC. Он совместим с ассемблером MASM фирмы Microsoft Corporation, но кроме того содержит много полезных расширений и улучшений и обладает более высоким быстродействием. Компилятор Турбо Ассемблера – это выполняемая программа, размещенная в файле TASM. EXE. Компилятор вызывается командой Tasm Name.asm, в которой Name.asm является именем компилируемого файла, и создает перемещаемый объектный файл Name.obj. Вызов компилятора в общем случае имеет вид: TASM fileset; fileset; …; fileset где fileset представляет собой конструкцию вида Options, sources, object, list, xref причем options представляет собой название опции, sources – имя исходного файла или последовательность таких имен, разделенных символом + (плюс) либо пробелом, object – имя результирующего файла(.OBJ), list - имя файла, куда будет помещен листинг компиляции, а xref – имя файла, куда будет помещена таблица перекрестных ссылок. Таблица перекрестных ссылок содержит перечень символических имен модуля, мест, в которых они определены, а также номера строк, в которых появились ссылки на них. Например, команда TASM /l prim1+prim2, prim; /zi test приведет к созданию из исходных модулей prim1.asm и prim2.asm результирующего модуля prim.obj, а также листинга компиляции, который будет помещен в файле prim.lst (опция /l) и, кроме того, созданию из исходного модуля test.asm с использованием опции /zi результирующего модуля test.obj. С целью создания исполнительной программы необходимо провести компоновку результирующих модулей.obj с предполагаемыми библиотечными модулями. Эту задачу выполняет компоновщик Turbo Link фирмы Borland Int. Компоновщик является выполняемой программой, хранящейся в файле TLINK.EXE. Вызов компоновщика TLINK в общем случае имеет вид TLINK options, objects, exec, map, libraries где options – набор опций, objects – множество имен файлов, содержащих результирующие модули, exec – имя файла, в который будет помещена выполняемая программа, map – имя файла, в который будет помещена карта компоновки, libraries – множество имен файлов, содержащих библиотеки результирующих модулей. Опции отделяются пробелами, имена файлов должны быть отделены пробелами или знаками + (плюс). Порядок выполнения работы. 1. Введите в компьютер исходный ассемблерный текст программы с помощью любого текстового редактора. При использовании встроенного редактора NC: F4 – редактирование выделенного курсором файла; SHIFT+F4 – создание нового файла, не имеющегося на диске, нужно ввести имя файла; ALT+F4 – внешний редактор. Введите данную программу: (Номера строк и угловые скобки не набирать! )
2. После выхода из редактирования убедитесь в наличии вашей программы в текущем каталоге – Name.ASM. Для получения.OBJ – модуля, необходимо в командную строку набрать имя транслятора и имя вашего файла – TASM.EXE NAME.ASM. Быстрый способ: - выделите на панели файл TASM.EXE, нажмите CTRL+ENTER - выделите на панели файл NAME.ASM, нажмите CTRL+ENTER Проверьте информацию в командной строке. Для выполнения трансляции нажмите ENTER. Если Ассемблер выдаст сообщения об ошибках, то нужно исправить исходную программу с помощью редактора и заново ее оттранслировать. 3. Для получения выполняемой программы, необходимо в командную строку набрать имя компоновщика TLINK.EXE и имя вашего объектного файла NAME.OBJ - TLINK.EXE NAME.OBJ нажмите ENTER. В текущем каталоге появится файл – NAME.EXE и файл, содержащий таблицу имен и размеров сегментов NAME.MAP. 4. Выделите курсором исполняемый файл и нажмите ENTER. Такое исполнение программы возможно при явных результатах или при полной уверенности в ее безошибочной работе.
Задания. Написать программу. 1. Вывод сообщения на экран с начала строки. 2. Вывод сообщения на экран с середины экрана. 3. Вывод сообщения на экран с начала строки и в рамке, построенной из любых символов псевдографики. 4. Вывод сообщения в рамке на середину экрана. 5. Вывод на экран символа с помощью функции 2h, для этого запишите в сегменте кодов:
6. Вывод сообщения на экран. Перед выдачей сообщения очистить экран функцией 6 int 10h:
Вставить эти 8 команд после 9-й строки. 7. Вывод сообщения на экран. Перед выдачей сообщения установить курсор функцией 2 int 10h:
Вставить эти команды перед выдачей символа или сообщения. 8. Вывод сообщения на экран. Перед выдачей сообщения нарисовать цветное окно функцией 6 int 10h и установить курсор функцией 2 int 10h.
Основная литература –3[12-18] Контрольные вопросы: 1. Структура программы на языке ассемблера. 2. Этапы выполнения программы. 3. Функции вывода 9h и 2h int 21h. 4. Как создается исходный файл? 5. Расширение исходного файла. 6. Имя транслятора. 7. Что делает транслятор? 8. Какие выходные файлы получаются в результате трансляции? (с какими расширениями) 9. Пример командной строки запуска транслятора. 10.Имя компоновщика. 11.Какие файлы являются входными при компоновке? 12.Какие файлы являются выходными при компоновке? 13.Какое расширение имеет исполняемый файл? 14.Пример командной строки запуска компоновщика. 15.Как можно посмотреть файл листинга? ЛАБОРАТОРНАЯ РАБОТА 2 - Описание простых типов данных. Отладчик TURBO DEBUGGER (TD).
Цель работы: изучить правила описания простых типов данных и основные моменты работы с отладчиком TD.
Методические рекомендации по выполнению лабораторной работы TASM предоставляет широкий набор средств описания и обработки данных, который можно сравнить с аналогичными средствами некоторых языков высокого уровня. Правила описания простых типов данных являются базовыми для описания более сложных типов. Для описания простых типов данных в программе используются специальные директивы резервирования и инициализации данных, которые по сути являются указаниями транслятору на выделение определенного объема памяти. Существуют следующие поддерживаемые TASM директивы данных:
Директивы данных имеют следующий формат: [Имя ] мнемоника директивы [выражение] [; комментарий]. При определении переменной без присваивания ей начального значения надо указывать в поле выражения вопросительный знак (? ).Например: А db? - неинициализированная переменная А (содержимое выделенного участка физической памяти в 1 байт изменяться не будет). A db 10011011b - инициализированная переменная (транслятор выделяет 1 байт памяти переменной А и записывает указанное значение в память). Порядок размещения данных в памяти напрямую связан с логикой работы микропроцессора с данными. Микропроцессоры INTEL требуют следования данных в памяти по принципу: младший байт по младшему адресу. Отладчик Turbo Debugger (TD) представляет собой оконную среду отладки программ на уровне исходного текста на многих языках программирования и, в том числе на ассемблере. Он позволяет определить причину и место логической ошибки. Основную часть экрана отладчика занимают одно или несколько окон. В каждый момент времени активным может быть только одно из них. Активизация любого окна производится щелчком мышью в любой видимой точке окна. Управление работой отладчика ведется с помощью системы меню. Имеется два типа таких меню: - глобальное меню – находится в верхней части экрана и доступно постоянно, вызов клавишей F10; - локальное меню - для каждого окна отладчика можно вызвать его собственное меню, которое учитывает осбенности этого окна, клавиши ALT-F10. Из четырех режимов чаще всего вам придется работать в режиме пошагового выполнения программы. В этом режиме вы можете выполнить программу по командам, при этом можно наблюдать результат исполнения каждой команды. Для активизации этого режима нужно нажать клавиши F7 (процедуры также выполняются по шагам) или F8 (процедура отрабатывается как одна команда). В этом режиме полезно использовать окно CPU, которое можно вызвать через меню VIEW|CPU. Это окно отражает состояние микропроцессора и состоит из 5 подокон: - окна с исходной программой в дизассемблированном виде. Это та же программа, что и в окне MODULE, но уже в машинном коде. Пошаговую отладку можно производить прямо в этом окне; - REGISTERS – окна регистров микропроцессора, отражающего текущее состояние регистров; - окна флагов, которое отражает текущее состояние флагов микропроцессора; - окна стека STACK, отражающего содержимое памяти, выделенной для стека; - окна с дампом памяти DUMP, отражающего содержимое области памяти данных. В окне отладчика под названием MODULE вы увидите исходный текст программы с курсором выполнения (в виде треугольника). Исходный модуль должен быть оттранслирован с опцией /zi: Tasm /zi имя_исходного_модуля Компоновка модуля должна быть осуществлена с опцией / v: Tlink /v имя_объектного_модуля Запуск отладчика производить из командной строки с указанием исполняемого модуля программы: Td имя_исполняемого_модуля.
Задания. 1. Наберите исходный текст программы согласно варианту:
Получив загрузочный модуль, запустите его в Турбо отладчике (TD). В окне DUMP просмотреть сегмент данных, найти все переменные, заданные в вашем варианте и объяснить местоположение и занимаемый объем этой переменной. Вы ответственны не только за описание переменной в сегменте данных, но и за каждый байт памяти. 2. Набрать в кодовом сегменте команды:
В отладчике посмотреть результат выполнения этих команд Варианты заданий:
Основная литература –3[690-691] Контрольные вопросы:
Команды организации цикла LOOP – команда организации цикла со счетчиком в регистре CX. LOOP метка Количество повторений цикла задается значением в регистре СХ перед входом в последовательность команд, составляющих тело цикла Алгоритм работы: выполняется декремент содержимого регистра CX, затем анализ регистра CX. Если CX=0, то управление передается следующей за LOOP команде, а если CX > 0, то – метке, которая указана в качестве операнда LOOP. Выполнение команды не влияет на состояние флагов. Команды безусловной передачи управления: 1. Команда безусловного перехода - JMP метка; 2. Вызов процедуры и возврата из процедуры - CALL имя_процедуры и RET; 3. Вызов программных прерываний - INT номер_прерывания, возврат из программных прерываний – IRET и команда INTO - прерывание, если переполнение. Команды условной передачи управления: 1. Команды перехода по результату команды сравнения: CMP операнд1, операнд2 Алгоритм работы: выполняется вычитание (операнд1- операнд2), затем в зависимости от результата выставляются флаги, операнд1 и операнд2 не изменяются (то есть результат не запоминается).
2. Команды перехода по состоянию определенного флага
3. Команды перехода по содержимому регистра СХ
Порядок выполнения работы Задана программа пересылки массива байтов А на место массива байтов В.
Задания:
1. Перед выводом массива В на экран вывести текстовую строку: ”Это второй массив В”, т.е. на экране должно быть: Массив С 7 8 9 6 4. Измените предыдущую программу для выборки минимальных элементов в массив С, т.е. мы должны получить следующий результат: Массив С 4 5 2 3 5. Напишите программу, которая выбирает из элементов заданного массива байтов максимальный элемент. Например,
В результате будем иметь: Команды сложения ADD - команда сложения. Формат команды: ADD приемник, источник. ADС - команда сложения с переносом. Формат команды: ADС приемник, источник. При исполнении команды сложения ADD результат заносится в операнд источник. При исполнении команды ADC результат также заносится в операнд источник, но при сложении используется флаг переноса CF. Состояние флагов после выполнения команд ADD и ADC: могут измениться значения CF, PF, AF, ZF, SF, ОF. ААА - ASCII – коррекция результата сложения. Команда ААА корректирует результат сложения для представления в кодах ASCII. Она преобразует содержимое регистра AL в правильную неупакованную десятичную цифру. Команда используется в следующем контексте: add AL, BL aaa DAA - десятичная коррекция результата сложения Команда DAA корректирует сложение для представления в десятичной форме. Она преобразует содержимое регистра AL в две правильные упакованные десятичные цифры. Используется в контексте. add AL, BL daa Команды AAA и DAA не требуют наличия операндов, т.к. предполагают, что корректируемое значение находится в регистре AL. INC – увеличение операнда на 1. Формат команды: INC операнд Команда INC добавляет единицу к содержимому регистра или ячейки памяти. Команда удобна для приращения значений счетчиков в циклах, командах и значения индексного регистра или указателя при доступе к последовательно расположенным ячейкам памяти. Состояние флагов после выполнения команды: меняются PF, AF, ZF, SF, ОF. Команды вычитания. SUB - команда вычитания. Формат команды: SUB приемник, источник SBB - команда вычесть с заемом. Формат команды: SBB приемник, источник Использование команд SUB и SBB аналогичны командам сложения. Воздействуют на те же 6 флагов. AAS - ASCII – коррекция результата вычитания. Команда AASкорректирует результат вычитания для представления в кодах ASCII. DAS - десятичнаякоррекция результата вычитания. Команда DASкорректирует результат вычитания для представления в десятичной форме. Команды AAS и DAS аналогичны командам AAA и DAA. Используются в контексте: sub AL, BL или sub AL, BL aas das DEC – уменьшение опенанда на 1. Формат команды: DEC операнд Команда DEC вычитает единицу из содержимого регистра или ячейки памяти. NEG - команда изменения знака операнда. Формат команды: NEG операнд Команда вычитает значение операнда из нулевого значения. Пусть значение содержимого регистра AL нужно вычесть из 100. Так как цифра 100 не может служить операндом приемником, то запись sub 100, AL недопустима. Поэтому для организации такого вычитании необходимо записать следующие команды neg AL add AL, 100 Состояние флагов после выполнения команды: меняются значения OF, SF, ZF, AF, PF и СF = 1, если операнд ненулевое число, в противном случае они равны нулю. СМР - Команда сравнения. Формат команды: СМР приемник, источник Команда вычитает источник из приемника и в зависимости от результата, устанавливает флаги, операнды приемник и источник не меняются. Состояние флагов после выполнения команды: меняются значения OF, SF, ZF, AF, PF и СF.
Команды умножения MUL - Команда умножения чисел без знака. Формат команды: MUL источник. IMUL - Команда целого умножения чисел со знаком. Формат команды: IMUL источник. Источником может быть регистр общего назначения или ячейка памяти размером в байт, слово или двойное слово. В качестве второго операнда используется содержимое регистров AL (для байтов), AX (для слов) или EAX (для двойных слов). Произведение имеет двойной размер и возвращается следующим образом: умножение байтов возвращает 16-битовое произведение в регистрах АН (старший байт) и AL (младший байт); умножение слов возвращает 32-битовое произведение в регистрах DX (старшее слово) и АХ (младшее слово); умножение двойных слов возвращает 64-битовое произведение в регистрах EDX (старшее двойное слово) и EАХ (младшее двойное слово). Состояние флагов после выполнения команды MUL: CF = OF = 0, если старшая половина произведения равна нулю, в противном случае они равны единице. Состояние флагов после выполнения команды IMUL: CF = OF = 0, если старшая половина произведения представляет собой лишь расширение знака младшей половины, в противном случае они равны единице. ААМ – ASCII коррекция результата умножения. Команда преобразует результат предшествующего умножения байтов в два правильных неупакованных десятичных операнда. Команды деления. DIV - Команда деления без знака. Формат команды: DIV источник IDIV - Команда деления чисел со знаком. Формат команды: IDIV источник Делитель размером в байт, слово или двойное слово находится в регистре общего назначения или в ячейке памяти. Делимое должно иметь двойной размер, оно извлекает из регистров АН и АL (при делении на 8-битовое число), из регистров DX и AX (при делении на 16-битовое число) или из регистров EDX и EAX (при делении на 32-битовое число). Результат возвращается следующим образом: если источник представляет собой байт, то частное возвращается в регистр AL, а остаток в регистр АН. Если источник представляет собой слово, то частное возвращается в регистр АХ, а остаток - в DX и если источник представляет собой двойное слово, то частное возвращается в регистр EАХ, а остаток - в EDX. AAD - ASCII коррекция результата деления. Исполняется непосредственно перед операцией деления. Команда преобразует неупакованное делимое в двоичное число и загружает его в регистр AL.
Команды обработки строк. Система команд микропроцессора имеет очень интересную группу команд, позволяющих производить действия над блоками элементов от 1 Байта до 64 Кбайт (для 32-разрядных микропроцессоров – до 4 Гбайт). Это - цепочечные команды или команды обработки строк символов. Эти блоки логически могут представлять собой последовательности элементов с любыми значениями, хранящимися в памяти в виде двоичных кодов. Микропроцессор всегда предполагает, что строка-приемник находится в дополнительном сегменте (адресуемом посредством сегментного регистра ES), а строка-источник – в сегменте данных (адресуемом посредством сегментного регистра DS). Микропроцессор адресует строку - приемник через регистр DI, а строку-источник - через SI. Допускается переопределять сегмент для строки_источника, для строки-приемника этого делать нельзя. Особенность работы цепочечных команд состоит в том, что они автоматически выполняют приращение или уменьшение содержимого регистров DI и SI в зависимости от используемой цепочечной команды. Что именно происходит с этими регистрами, определяется состоянием флага DF, которым управляют команды CLD и STD. Всего в системе команд микропроцессора имеется пять операций- примитивов обработки цепочек. Каждая из них реализуется в микропроцессоре двумя командами (для для 32-разрядных микропроцессоров - тремя командами), в свою очередь, каждая из этих команд работает с соответствующим размером элемента – байтом, словом или двойным словом. Популярное: |
Последнее изменение этой страницы: 2016-04-11; Просмотров: 582; Нарушение авторского права страницы