Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Структура описания лабораторной работыСтр 1 из 6Следующая ⇒
ВВЕДЕНИЕ В данном руководстве содержатся все сведения о системе команд, директивах языка ассемблера, системе программирования TASM, операционной системе MS-DOS, необходимые для выполнения работ. Однако эти сведения не претендуют на полноту описания, поэтому данное руководство лучше использовать как практическое дополнение к другим источникам информации о языке ассемблера ПЭВМ IBM PC. Структура описания лабораторной работы Описание каждой работы состоит из следующих разделов: цель работы – кратко излагается основная цель работы и перечисляются ожидаемые результаты; основные сведения – приводятся минимальный объем сведений, необходимых для выполнения работы; пример выполнения работы – приводится типовое задание и программа, реализующая поставленную задачу. Пример можно рассматривать как шаблон выполнения соответствующей работы; варианты заданий; контрольные вопросы – перед защитой работы рекомендуется попытаться ответить на все поставленные вопросы. ВЫПОЛНЕНИЕ РАБОТЫ При выполнении каждой работы следует руководствоваться следующей последовательностью шагов: прочесть описание и разобрать предложенный пример; написать программу(ы) согласно варианту задания; создать с помощью текстового редактора файл с текстом программы(ы); оттранслировать программу(ы), добиться отсутствия ошибок трансляции; запустить и отладить программу при нескольких наборах исходных данных; ответить на контрольные вопросы. ФОРМА ОТЧЕТА Отчет по лабораторной работе должен включать: · вариант задания; · тексты программ (желательно в виде листинга трансляции); · исходные данные и результаты выполнения программы для нескольких наборов данных.
ЦЕЛЬ РАБОТЫ Цель настоящей работы – выработка навыков подготовки и трансляции программ на языке ассемблера в операционной системе MS-DOS и отладки программ с использованием отладчика. ОСНОВНЫЕ СВЕДЕНИЯ Запись программ на языке ассемблера Программа на языке ассемблера представляет собой текст, разбитый на строки. Каждая строка либо соответствует машинной команде, либо является директивой ассемблера или макрокомандой. Команды и директивы можно набирать как заглавными, так и строчными латинскими буквами. Русские буквы можно использовать только в комментариях. Строка программы в общем случае состоит из четырех полей: поля метки или имени, поля операции, поля операндов и поля комментария. Поля удобно разделять табуляцией. Имена данных, процедур, сегментов или метки команд могут состоять не более чем из 255 латинских буквы или цифр, причем первым символом должна быть обязательно буква. По умолчанию в имени значащими являются первые 32 символа. Заглавные и строчные буквы могут ассемблером различаться или не различаться (ключи: /ML, /MU и /MX). Метки машинных команд должны заканчиваться символом двоеточия. При трансляции каждому имени ставится в соответствие ряд атрибутов. Поле операции содержит мнемокод машинной команды, директивы или макрокоманды. Заглавные и строчные буквы в мнемокоде операции ассемблером не различаются. Поле операндов служит для записи операндов, если они требуются. Если операндов несколько они, как правило, разделяются запятыми. Поле комментариев служит для пояснений к командам. Это поле не обязательно. Комментарий начинается с символа точка с запятой и заканчивается с концом строки. В программах на языке ассемблер допустимы несколько типов констант: · десятичные – последовательность цифр от 0 до 9; · шестнадцатеричные – последовательность шестнадцатеричных цифр от 0 до 9 и от A или a до F или f, завершающаяся буквой H или h, первой должна быть десятичная цифра; · восьмеричные – последовательность цифр от 0 до 7, завершающаяся буквами Q, q, O или o; · двоичные – последовательность цифр 0 или 1, завершающаяся буквой B или b. Ниже приведена типичная структура простой программы на ассемблере.
model SMALL stack 100h dataseg ...; данные codeseg startupcode ...; код QUIT: exitcode 0 end
Директивы stack, dataseg и codeseg служат для выделения сегментов. Макрокоманда startupcode содержит инициализирующий код, который обеспечивает загрузку сегментных регистров DS и SS. Макрокоманда exitcode < код возврата> осуществляет завершение выполнения программы и передачу управления ОС. Необязательный параметр < код возврата> служит для возврата значения, которое можно проверить в командных файлах ОС. Директива end < метка точки входа> отмечает конец текста программы и указывает ассемблеру, где завершить трансляцию. Поэтому директива end должна присутствовать в каждой программе. Необязательный параметр < метка точки входа> указывает инструкцию, с которой должно начинаться выполнение программы. Директивы < имя> DW < выражение>, < выражение>,... и < имя> DB < выражение>, < выражение>,... служат для определения данных, слов или байтов, соответственно. < выражение> может быть константой или, если значение не определено, можно использовать символ вопросительного знак. Конструкция < число> dup (< выражение>, < выражение>,...) используется для повторения последовательности выражений в скобках заданное < число> раз. Обработка программ в DOS Обработка программ на языке ассемблера в DOS состоит из нескольких этапов: · создание с помощью текстового редактора файла с текстом программы на языке ассемблера; · трансляция программы с помощью ассемблера TASM; · компоновка программы с помощью компоновщика (редактора связей) TLINK; · запуск и отладка программы. Трансляция программы Для трансляции исходного файла необходимо ввести командную строку следующего вида: tasm < ASM-файл> [, [< OBJ-файл> ][, [< LST-файл> ] [, [< CRF-файл> ]]]] [< ключи> ] Замечание. Имя файла NUL означает, что соответствующий файл не формируется. Для входных и выходных файлов TASM использует следующие умолчания: · исходный файл: расширение – ASM; · объектный файл: имя совпадает с именем исходного файла, расширение – OBJ; · файл листинга: имя – NUL, если задан ключ /L или /LA – имя файла листинга совпадает с именем исходного файла, если имя указано или задан ключ /L или /LA, то расширение по умолчанию – LST; · файл перекрестных ссылок: имя – NUL, если задан ключ /C – имя файла перекрестных ссылок совпадает с именем исходного файла, если имя указано или задан ключ /C, то расширение по умолчанию – CRF. Ассемблер имеет различные режимы трансляции, задаваемые с помощью ключей, наиболее часто используемыми можно считать следующие: · /L и /LA – формировать файл листинга или расширенного листинга; · /C – формировать файл с таблицей перекрестных ссылок: список идентификаторов исходного модуля с указанием номеров строк программы, в которых упоминается данный идентификатор; · /ZI – поместить в объектный модуль полную информацию для отладчика: идентификаторы данных и меток, номера строк, и т.п. Например: tasm primer /L /ZI Транслируется файл PRIMER.ASM, создаются файл листинга PRIMER.LST и, если нет ошибок, объектный файл PRIMER.OBJ. В объектный файл включается полная информация для отладчика. Компоновка программы Для компоновки объектного файла необходимо ввести командную строку следующего вида: tlink < OBJ-файл> [, [< EXE-файл> ][, [< MAP-файл> ] [, [< библиотеки> ]]]] [< ключи> ] Для входных и выходных файлов TLINK использует следующие умолчания: · объектный файл: расширение – OBJ; · исполняемый файл: имя совпадает с именем объектного файла, расширение – EXE; · файл плана модуля: имя – NUL, если задан ключ /M – имя файла плана модуля совпадает с именем объектного файла, если имя указано или задан ключ /M, то расширение по умолчанию – MAP. Компоновщик имеет различные режимы трансляции, задаваемые с помощью ключей, наиболее часто используемыми можно считать следующие: · /M – формировать файл плана модуля: список всех глобальных идентификаторов, сегментов с указанием их типов, атрибутов, адресов; · /V – поместить в исполняемый модуль полную информацию для отладчика: идентификаторы данных и меток, номера строк, и т.п. Например: tlink primer /M /V Выполнить компоновку объектного файла PRIMER.OBJ. Исполняемый файл будет иметь имя – PRIMER.EXE, в него будет включена информация для отладчика. Будет создан файл плана модуля с именем PRIMER.MAP. Запуск программы Запуск программы на выполнение можно осуществить, набрав в командной строке имя файла программы (расширение EXE указывать необязательно): primer Для запуска под отладчиком необходимо запустить отладчик с указанием имени файла вашей программы: td primer.exe Использование отладчика TD Не претендуя на полноту описания, приведем описание основных функций и возможностей отладчика TD. Меню View Окно Module В окне Module (Модуль) на экран выводится текст отлаживаемой программы. Вы можете перемещаться по тексту, выполнять строки программы и просматривать данные и код. Окно CPU Окно CPU (ЦП) показывает текущее состояние центрального процессора (ЦП). Это окно содержит пять панелей (областей), в которых показаны: · дамп памяти (как правило, сегмент данных); · содержимое стека; · содержимое регистров ЦП; · машинные инструкции; · содержимое флагов ЦП. Окно CPU полезно использовать, когда вы хотите просмотреть точную последовательность инструкций, которую образует строка исходного кода программы, или структуру данных. Однако для отладки большинства программ данное окно вам не понадобится. Окно Watches В окне Watches (Просмотр) выводятся переменные и их изменяющиеся значения. Нажав клавиши Ctrl+F7 при позиционировании курсора на имени переменной в окне Module, вы можете добавить в окно Watches новую переменную. Локальное меню окна Watch (Alt+F10 или Ctrl+F10) содержит пункты: · Watch (Просмотр) выводит подсказку для ввода имени переменной или выражения, чтобы добавить его к списку окна Watches (оно добавляется в конец списка); · Edit (Редактирование) позволяет редактировать выражение в окне Watches. Вы можете изменять то, что там находится или вводить новое значение; · Remove (Удаление) удаляет из окна Watches текущую выбранную запись; · Delete All (Удалить все) удаляет из окна Watches все записи; · Inspect (Проверка) открывает окно проверки (окно Inspector), в котором выводится содержимое подсвеченной в данный момент в окне Watches записи; · Change (Изменение) изменяет значение подсвеченной в данный момент записи в окне Watches на значение, которое вы вводите в ответ на подсказку. Окно Dump В окне Dump (Дамп) выводится в непосредственном виде содержимое области памяти. (Это окно эквивалентно области дампа окна CPU.) Вы можете выводить данные в виде символов, шестнадцатеричных байтов, слов, двойных слов, или в любом формате с плавающей точкой. Данное окно можно использовать для просмотра в непосредственном виде некоторых данных, когда вам не требуются остальные части окна CPU. В локальном меню этого окна имеются команды, позволяющие вам модифицировать выводимые данные, изменять формат их вывода, а также манипулировать блоками данных. Локальное меню окна Dump (Alt+F10 или Ctrl+F10) содержит пункты: · Goto (Переход) – выводит на экран данные по новому адресу; · Change (Изменение) – изменяет байты данных по адресу курсора; · Display As (Режим вывода) – задает режим вывода дампа: байтами, словами и т.п. Экран пользователя Экран пользователя – это экран вывода вашей программы. Этот экран будет иметь точно такой же вид, какой он имел бы при выполнении вашей программы без отладчика (непосредственно под DOS). Вы можете использовать данный экран для того, чтобы проверить, что выводит ваша программа, и соответствует ли это тому, что должно быть на экране. Для переключения в экран пользователя выберите пункт меню Window+User Screen (или нажмите Alt+F5). Меню Run Команда Run Команда Run (Выполнение, F9) запускает вашу программу на выполнение. При наступлении одного из следующих событий управление передается отладчику: · ваша программа завершила выполнение; · обнаружена точка останова с действием прерывания; · вы прервали выполнение с помощью клавиш Ctrl+Break. Команда Go to Cursor Команда Go to Cursor (Перейти к курсору, F4) выполняет программу до той строки, где находится курсор (в текущем окне Module или области Code окна CPU). Команда Trace Into Команда Trace Into (Трассировка вглубь, F7) выполняет одну строку исходного кода или машинную инструкцию. Если текущая строка содержит вызов процедуры или функции, то отладчик выполняет трассировку этой процедуры. Однако если текущим окном является окно CPU, то выполняется одна машинная инструкция. Команда Step Over Команда Step Over (Шаг с пропуском, F8) выполняет одну строку исходного кода или машинную инструкцию, минуя трассировку вызываемой процедуры или функции. При этом обычно выполняется одна строка исходного текста программы. Однако если текущим окном является окно CPU, то выполняется только одна машинная инструкция. Когда эта команда выполняется для одной машинной инструкции, Турбоотладчик интерпретирует некоторые инструкции, как одну, даже если они приводят к выполнению нескольких инструкций: · call – вызов подпрограммы; · int – вызов прерывания; · loop, loopz, loopnz – управление циклом; · rep, repnz или repz, за которыми следуют инструкции cmps, lods, movs, scas, stos. Команда Instruction Trace Команда Instruction Trace (Трассировка инструкций, Alt+F7) выполняет одну инструкцию. Ее можно использовать, когда вы хотите трассировать прерывание, или когда вы находитесь в окне Module и хотите выполнять трассировку процедуры или функции, которая находится в модуле без отладочной информации (например, в библиотечной подпрограмме). Команда Program Reset Команда Program Reset (Сброс программы, Ctrl+F2) перезагружает отлаживаемую вами программу с диска. ПРИМЕР ВЫПОЛНЕНИЯ РАБОТЫ Дан массив из десяти слов, содержащих целые числа. Требуется найти максимальное значение. Текст программы: model SMALL stack 100h
dataseg MAX dw? MASS dw 10h, 20h, 30h, 5h, 40h, 15h, 20h, 70h, 35h, 34h
codeseg startupcode
lea BX, MASS; Загрузить адрес массива mov CX, 10; Установить счетчик mov AX, [BX]; Первый элемент массива в аккумулятор BEG: cmp [BX], AX; Сравнить текущий эл. массива с макс. jle NO; он меньше mov AX, [BX]; он больше NO: add BX, 2; Следующий элемент массива loop BEG; mov MAX, AX
QUIT: exitcode 0 end
Программа с помощью текстового редактора заносится в файл PRIMER.ASM. Затем выполняется трансляция и компоновка с помощью команд: tasm primer /L /ZI tlink primer /V Запуск программы primer под отладчиком. td primer.exe Простейший пример использования отладчика: в окне Module или CPU установить курсор на строку с меткой QUIT и выполнить команду Go to Cursor. После останова посмотреть содержимое области данных. Для того что бы просмотреть область данных, следует выполнить следующие действия: · открыть окно Dump или сделать активной одноименную панель окна CPU; · с помощью пункта GoTo локального меню окна (или панели) выполнить позиционирование по адресу DS: 0. Перед позиционированием необходимо обеспечить правильное значение регистра DS, как правило, это означает выполнение первых двух строк программы по загрузке регистра DS адресом сегмента данных; · с помощью пункта DisplayAs локального меню окна (или панели) обеспечить просмотр данных в формате слов. Первое слово сегмента данных со смещением 0 – это переменная max, далее следует десять слов – числа массива, и далее – мусор. Можно попробовать запустить программу в пошаговом режиме (команда Trace Into), следя за тем, как изменяются значения регистров AX, BX, CX. Рекомендуется запустить программу заново (команда Program Reset), изменить данные (окно Dump, команда Change), предсказать результат для новых данных и, выполнив программу (команда Go to Cursor) до метки QUIT, сравнить ожидаемый результат с реальным. Выход из отладчика в DOS – Alt+X. КОНТРОЛЬНЫЕ ВОПРОСЫ 1. Назначение программы TASM. 2. Назначение программы TLINK. 3. Что содержится в файлах *.ASM, *.OBJ, *.LST, *.MAP? 4. Назначение программы TD. 5. Какие команды и окна отладчика служат для просмотра и модификации памяти? 6. Какие команды и окна отладчика служат для просмотра регистров? 7. Какие команды отладчика служат для выполнения программы? 8. Что такое точки останова?
ЦЕЛЬ РАБОТЫ Цель настоящей работы – освоение арифметических команд, программирование формул на языке ассемблера. ОСНОВНЫЕ СВЕДЕНИЯ Команды двоичной арифметики
Режимы адресации Обозначения: R – регистр, V – переменная, C – константа.
Замечание. Для всех режимов адресации при формировании физического адреса используется сегментный регистр DS, за исключением случаев, когда в качестве базового регистра выступает регистр BP, в этом случае используется сегментный регистр SS. ПРИМЕР ВЫПОЛНЕНИЯ РАБОТЫ Дана формула: X = 3A + (B + 5)/2 – C – 1. A, B, C, X - целые знаковые числа, занимающие слово. Написать программу, реализующую данную формулу. Распишем формулу по отдельным операциям:
Текст программы: model SMALL stack 100h dataseg A dw 10 B dw 20 C dw 5 X dw? codeseg startupcode mov AX, A; значение А в регистр AX sal AX, 1; 2A в AX add AX, A; 3A в AX mov BX, B; B в BX add BX, 5; B+5 в BX sar BX, 1; (B+5)/2 в BX add AX, BX; 3A+(B+5)/2 в AX sub AX, C; 3A+(B+5)/2-C в AX dec AX; 3A+(B+5)/2-C-1 в AX mov X, AX; 3A+(B+5)/2-C-1 в X ; Конец работы QUIT: exitcode 0 end
Предсказать результат и проверить совпадает ли он с полученным. Попробовать другие варианты данных. Данные изменять непосредственно в отладчике, используя окна Watch или Dump. ВАРИАНТЫ ЗАДАНИЙ Разработать программу, реализующую указанную формулу, исполнить программу с несколькими наборами исходных данных, проверить правильность результатов. 1. X = –4A + ( B + C )/ 4 + 2 2. X = (A – B) / 4 – 2C + 5 3. X = (A/2 + B) / 4 + C – 1 4. X = (7A – 2B – 100) / 2 + C 5. X = – (C + 2A + 4B + 8 ) 6. X = –A/2 + 4( B + 1 ) – 3C 7. X = A – 5( B – 2C ) + 2 8. X = 6C + ( B – C + 1)/2 КОНТРОЛЬНЫЕ ВОПРОСЫ 1. Из каких полей состоит строка программы на ассемблере? 2. Какие поля обязательны, а какие можно опустить? 3. Назначение директив stack, dataseg и codeseg. 4. Назначение макрокоманд startupcode, exitcode. 5. Назначение директив db, dw. 6. Назначение оператора dup в директивах db, dw. 7. Назначение директивы end. 8. В чем различие между командами: 9. Какая директива завершает текст программы? 10. В чем различие между командой mov A, 1 и директивой A dw 1? 11. Пусть имя файла исходной программы – LAB.ASM. Что будут содержать файлы: LAB.OBJ, LAB.LST, LAB.EXE? 12. Для чего используется отладчик? 13. Как изменится содержимое AL и флагов после выполнения команд
ЦЕЛЬ РАБОТЫ Цель настоящей работы – выработка навыков разработки простых циклических программ на языке ассемблера. ОСНОВНЫЕ СВЕДЕНИЯ Программирование разветвляющихся вычислений на языке ассемблера связано с использованием команд условного перехода. Каждая из этих команд проверяет некоторый код условия или их комбинацию, и в случае выполнения условия выполняет переход по указанному адресу. При невыполнении условия управление передается следующей команде программы. Для выработки кода условия можно воспользоваться командами cmp, test. Кроме того, коды условия вырабатываются арифметическими и логическими командами. Для организации циклических вычислений можно также использовать команды условного перехода, однако в случае организации цикла по счетчику удобнее воспользоваться командами цикла loop. Одно из важнейших применений циклов – обработка массивов. В языке ассемблера существует возможность описывать только одномерные массивы. Для этого используют директивы описания данных db, dw, dd и др. При выполнении цикла часто требуется при каждом новом повторении обращаться к следующему элементу массива. Фактически это означает необходимость увеличения адреса текущего элемента. Очевидно, это можно сделать, если для обращения к элементу массива применять индексный или базовый режим адресации. Важным моментом при программировании циклов является проверка условия окончания цикла. Есть несколько возможных вариантов организации такой проверки. Если число повторений заранее известно, то можно в одном из регистров (лучше в CX) вести счетчик повторений, тогда условием окончания будет достижение счетчиком заданного значения. Иногда вместо счетчика удобнее использовать значение адреса обрабатываемого элемента массива, в этом случае за условие окончания следует принять выход адреса за пределы массива. Следует очень внимательно относиться к выбору конкретного значения счетчика или адреса, при котором заканчивается цикл. Практика программирования показывает, что одним из самых распространенных типов ошибок в программах является выполнение на одно повторение цикла больше или меньше, чем нужно. ПРИМЕР ВЫПОЛНЕНИЯ РАБОТЫ Дан массив из десяти слов, содержащих целые числа. Требуется найти максимальное значение. Текст программы:
model SMALL stack 100h
dataseg MAX dw? MASS dw 10h, 20h, 30h, 5h, 40h, 15h, 20h, 70h, 35h, 34h
codeseg startupcode
lea BX, MASS; Загрузить адрес массива mov CX, 10; Установить счетчик mov AX, [BX]; Первый элемент массива в аккумулятор BEG: cmp [BX], AX; Сравнить текущий элемент массива с макс. jl NO; он меньше mov AX, [BX]; он больше NO: add BX, 2; Следующий элемент массива loop BEG; mov MAX, AX
; Конец работы QUIT: exitcode 0 end
ВАРИАНТЫ ЗАДАНИЙ Дан массив из десяти целых знаковых чисел (слов или байтов). Требуется: 1. Найти количество отрицательных чисел. Массив байтов. 2. Найти суммы всех положительных и отрицательных чисел. Массив слов. 3. Найти среднее арифметическое чисел. Массив слов. 4. Найти количество чисел больших 10h. Массив слов. 5. Найти сумму абсолютных величин. Массив байтов. 6. Найти количество положительных чисел. Массив слов. 7. Поменять местами пары соседних чисел. Массив слов. 8. Переставить числа в обратном порядке. Массив байтов. 9. Заменить все отрицательные числа нулями. Массив слов. КОНТРОЛЬНЫЕ ВОПРОСЫ 1. Для чего нужен оператор ptr? 2. В чем отличие команд mov AX, offset MASS и lea AX, MASS? 3. В чем отличие команд mov AX, BX и mov AX, [BX]? 4. В чем отличие команд mov AX, [BP] и mov AX, [BX]? 5. В чем отличие команд mov AX, [BX+2] и mov AX, [BX]+2? 6. В чем отличие команд mov AX, [BX][SI] и mov AX, [SI][BX]? 7. Для организации каких вычислений служат команды loop, loope, loopne? 8. Модифицирует ли какие-нибудь регистры команда loop? 9. Можно ли организовать цикл по счетчику, не используя loop команды? 10. Можно ли организовать цикл while с помощью одной из loop команд?
ЦЕЛЬ РАБОТЫ Цель настоящей работы – освоение логических команд. ОСНОВНЫЕ СВЕДЕНИЯ Логические команды К логическим командам или точнее командам, оперирующим с отдельными битами, можно отнести команды, приведенные ниже, а также команды сдвигов.
Примеры использования логических команд Установить 3 и 0 биты в регистре AL, остальные биты не изменять or AL, 00001001b. Сбросить 4 и 6 биты в регистре AL, остальные биты не изменять and AL, 10101111b. Проинвертировать 4 и 2 биты в регистре AL, остальные биты не изменять xor AL, 00010100b. Перейти на метку LAB, если установлен 4 бит регистра AL, в противном случае продолжить выполнение программы test AL, 00010000b Посчитать число единиц в байте – регистре AL mov CX, 8 ПРИМЕР ВЫПОЛНЕНИЯ РАБОТЫ Дан массив из 10 байтов. Все байты имеют нулевые старшие биты. Необходимо каждый байт, содержащий 1 в 0-м бите, дополнить до четного числа единиц установкой 7-го бита байта, каждый байт, содержащий 0 в 0-м бите, дополнить до нечетного числа единиц установкой 7-го бита байта. Текст программы:
stack 100h
dataseg MB db 04h, 07h, 11h, 23h, 04h, 38h, 3Fh, 2Ah, 0Dh, 34h
codeseg startupcode
lea BX, MB; BX - текущий адрес массива MB mov CX, 10; CX - счетчик числа итераций BEG: mov AL, [BX]; считать очередной байт массива test AL, 00000001b; установлен-ли бит 0? jz BIT0CLR; нет, бит 0 сброшен ; бит 0 установлен test AL, 0FFh; четное число единиц? jp OK; да, больше ничего делать не надо or AL, 80h; нечетное, дополнить до четного jmp short OK BIT0CLR: ; бит 0 сброшен test AL, 0FFh; четное число единиц? jnp OK; нет, больше ничего делать не нужно or AL, 80h; четное, дополнить до нечетного OK: mov [BX], AL; записать измененный байт массива
inc BX; BX< -адрес очередн. элемента массива loop BEG
; Конец работы QUIT: exitcode 0 end ВАРИАНТЫ ЗАДАНИЙ 1. Дан массив из 10 байтов. Посчитать количество байтов, в которых сброшены 6 и 4 биты. 2. Дан массив из 8 байтов. Рассматривая его как массив из 64 бит, посчитать количество единиц. 3. Дан массив из 8 байтов. Рассматривая его как массив из 64 бит, посчитать длину самой длинной последовательности единиц. 4. Дан массив из 8 байтов. Рассматривая его как массив логических значений x0 x1 x2 x3 x4 x5 x6 x7 (true – есть ненулевые биты в байте, false – все биты нулевые), вычислить логическую формулу f = (x7& ~x6& x3& x1) V (x6& x4& x2& x1& ~x0) V (~x7& x6& x3& x1). 5. Дан массив из 5 байтов. Рассматривая его как массив из 10 тетрад, найти «исключающее или» всех 10 тетрад. 6. Дан массив из 10 байтов. Посчитать количество байтов, в которых сброшены 5 или 1 биты. 7. Рассматривая байт как набор логических значений x7 x6 x5 x4 x3 x2 x1 x0 (true – 1, false – 0), вычислить логическую формулу f = (x7& ~x6& x3& x1) V (x6& x4& x2& x1& ~x0) V (~x7& x6& x3& x1). 8. Дан массив из 10 байтов. Посчитать количество байтов, в которых установлены 3 и 7 биты. КОНТРОЛЬНЫЕ ВОПРОСЫ 1. В чем отличие команд test DST, SRC и and DST, SRC? 2. Как сбросить 5-й бит переменной – байта ВВ? 3. Как установить 5-й бит переменной – байта ВВ? 4. Как проинвертировать 5-й бит переменной – байта ВВ? 5. Как проверить, установлен ли 5-й бит переменной – байта ВВ? 6. Как проверить, четным или нечетным является количество установленных бит в переменной-байте ВВ? 7. Какие флаги условий модифицируются после выполнения команд and, or, xor? 8. В чем основное отличие команд логических и арифметических сдвигов? 9. Укажите максимальное число двоичных разрядов, на которое можно сдвинуть операнд с помощью одной команды сдвига? 10. В паре строк 11. В паре строк
ЦЕЛЬ РАБОТЫ Цель настоящей работы – освоение приемов обработки символьной информации, функций DOS для ввода с клавиатуры и вывода на терминал. ОСНОВНЫЕ СВЕДЕНИЯ ПРИМЕР ВЫПОЛНЕНИЯ РАБОТЫ Ввести строку с клавиатуры, посчитать количества всех десятичных цифр во введенной строке, посчитанные значения вывести на терминал. Текст программы:
model SMALL stack 100h
dataseg AskCont db 0Ah, 0Dh db 'Завершить работу - Esc, продолжить - ЛЮБАЯ Ê Ë À Â È Ø À ' db '$' Ask db 0Ah, 0Dh, 'Введите строку: ', '$' COUNT db 10 dup(? ); счетчики количества цифр CIFR db '0123456789ABCDEF'; таблица преобразования ; шестн.цифр для вывода INPSTR db 80, ?, 82 dup(? ); буфер ввода OUTSTR db 0Dh, 0Ah, ?, ' ', ?, ?, '$'; буфер вывода
codeseg startupcode
BEGIN: ; Ввод строки lea DX, Ask mov AH, 09h int 21h lea DX, INPSTR mov AH, 0Ah int 21h
; Обработка xor AX, AX lea BX, INPSTR+2; адрес начала введенной строки xor CX, CX mov CL, INPSTR+1; кол-во введенных символов строки BB: mov AL, [BX]; очередной символ строки cmp AL, '0'; код символа меньше, чем код нуля? jb NC; да, т.е. не цифра cmp AL, '9'; код символа больше, чем код девятки? ja NC; да, т.е. не цифра ; символ - десятичная цифра sub AL, '0'; получаем дв. значение цифры, т.е. mov SI, AX; индекс в массиве счетчиков COUNT inc COUNT[SI]; увеличиваем соответств. счетчик NC: inc BX; получить очередной символ строки loop BB
; Вывод результатов lea DX, OUTSTR xor SI, SI; Счетчик цифр OO: xor AX, AX mov AL, '0' add AX, SI; ASCII-код очередной цифры в SI mov OUTSTR+2, AL; в буфер вывода mov AL, COUNT[SI]; AL< -значение счетчика ; очередной цифры mov CL, 4; получаем shr AL, CL; в DI mov DI, AX; значение старшей шестн. цифры mov AL, CIFR[DI]; счетчика преобразуем в ASCII-код mov OUTSTR+4, AL; пересылаем в буфер вывода mov AL, COUNT[SI]; AL< -знач. счетчика очередн. цифры and AL, 0Fh; Получаем в DI значение mov DI, AX; младшей шестн. цифры счетчика mov AL, CIFR[DI]; преобразуем ASCII-код mov OUTSTR+5, AL; пересылаем в буфер вывода mov AH, 09h; Вывод сформированной в буфере int 21h; строки inc SI; Счетчик очередной цифры cmp SI, 10 jl OO
; Запрос на продолжение работы lea DX, AskCont mov AH, 09h int 21h mov AH, 08h int 21h cmp AL, 27 je QUIT jmp BEGIN
; Конец работы QUIT: exitcode 0 end ВАРИАНТЫ ЗАДАНИЙ 1. Ввести с клавиатуры строку. Сжать строку, т.е. удалить пробелы и табуляции. Вывести результаты на экран. 2. Ввести с клавиатуры строку. Преобразовать все малые буквы в большие. Вывести результаты на экран. 3. Ввести с клавиатуры строку. Посчитать количество слов в строке. Подумать, что является разделителем слов. Вывести результаты на экран. 4. Ввести с клавиатуры строку. Ввести с клавиатуры коротенькую строку – шаблон. Найти шаблон во введенной строке. Вывести на экран " ДА", если шаблон есть, и " НЕТ", если его нет. 5. Ввести с клавиатуры две строки. Сравнить их. Вывести на экран номер позиции, в которой строки различаются. 6. Ввести с клавиатуры строку. Если она длиннее некоторой величины, то обрезать, если короче – растянуть, вставив нужное число пробелов между словами. Вывести результаты на экран. 7. Ввести с клавиатуры строку, состоящую из нескольких слов. Вывести каждое слово на экран в отдельной строке, т.е. выдать слова в столбик. 8. Ввести с клавиатуры строку. Переставить в ней символы, поменяв местами первый с последним, второй с предпоследним и т.д. Вывести результаты на экран. КОНТРОЛЬНЫЕ ВОПРОСЫ 1. Что такое программное прерывание? 2. Какие возможности работы с клавиатурой имеются у программиста? 3. Чем отличаются друг от друга различные функции DOS, выполняющие ввод с клавиатуры? 4. Что такое расширенный код клавиатуры? Популярное:
|
Последнее изменение этой страницы: 2016-03-25; Просмотров: 1399; Нарушение авторского права страницы