Лекции.ИНФО


Структура описания лабораторной работы



ВВЕДЕНИЕ

В данном руководстве содержатся все сведения о системе ко­манд, директивах языка ассемблера, системе программирования 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. Что такое точки останова ?


Лабораторная работа

ÏÐÎÃÐÀÌÌÈÐÎÂÀÍÈÅ ËÈÍÅÉÍÛÕ ÊÎÍÑÒÐÓÊÖÈÉ

 

ЦЕЛЬ РАБОТЫ

Цель настоящей работы – освоение арифметических команд, программирование формул на языке ассемблера.

ОСНОВНЫЕ СВЕДЕНИЯ

Команды двоичной арифметики

 

ÌÍÅÌÎÊÎÄ OSZAPC ДЕЙСТВИЕ
mov DST, SRC ------ пересылка, DSTSRC
xchg OPND1,OPND2 ------ обмен, DSTSRC
add DST, SRC xxxxxx сложение, DSTDST+SRC
adc DST, SRC xxxxxx сложение с переносом, DSTDST+SRC+CF
inc OPND xxxxx- увеличить на единицу, OPNDOPND+1
sub DST, SRC xxxxxx вычитание, DSTDST-SRC
sbb DST, SRC xxxxxx вычитание с заемом, DSTDST-SRC-CF
dec OPND xxxxx- уменьшение на единицу, OPNDOPND-1
neg OPND xxxxxx изменение знака, OPND0-OPND
rcl DST, CONT x----x циклический сдвиг влево через CF
rcr DST, CONT x----x циклический сдвиг вправо через CF
rol DST, CONT x----x циклический сдвиг влево
ror DST, CONT x----x циклический сдвиг вправо
sal DST, CONT xxxuxx арифметический сдвиг влево
sar DST, CONT xxxuxx арифметический сдвиг вправо
shl DST, CONT xxxuxx логический сдвиг влево
shr DST, CONT xxxuxx логический сдвиг вправо

 

Режимы адресации

Обозначения: R – регистр, V – переменная, C – константа.

НАЗВАНИЕ ОБОЗНАЧЕНИЕ СОДЕРЖАНИЕ ПРИМЕР
РЕГИСТРОВАЯ ПРЯМАЯ R операнд находится в регистре mov AX, SI переслать со­держимое регистра SI в регистр AX
НЕПОСРЕДСТВЕННАЯ C непосредственный операнд - константа присутствует в ко­манде mov AX, 093Ah занести константу 093Ah в ре­гистр AX
ПРЯМАЯ V + C или V - C исполнительный ад­рес операнда при­сутствует в команде mov BX, WW+2 переслать в BX слово памяти, отстоя­щее от переменной с име­нем WW на 2 байта
КОСВЕННАЯ РЕГИСТРОВАЯ [R] где R - BP, BX, SI, DI регистр содержит адрес операнда mov [BX], CL переслать содержимое регистра CL по адресу, находящемуся в регистре BX
КОСВЕННАЯ РЕГИСТРОВАЯ ОТНОСИТЕЛЬНАЯ V[R] , C[R] , [R+V] , [R+C] , V.[R] , [R].C] , где R - SI,DI (ИНДЕКСНАЯ) BX,BP (БАЗОВАЯ) адрес операнда вы­числяется как сумма содержимого реги­стра и смещения mov M[BX], CL переслать содержимое регистра CL по адресу,отстоящему от переменной M на BX байт
ИНДЕКСНО-БАЗОВАЯ [BR][IR] , V[BR][IR] , [BR][IR]C ,где IR - SI, DI, BR - BX, BP адрес операнда вы­числяется как сумма содержимых базового и индексного реги­стров и возможного смещения mov [BX][SI]3, AL пере­слать содержимое реги­стра AL по адресу, сумме регистров BX, SI и кон­станты 3

 

Замечание. Для всех режимов адресации при формировании физического адреса используется сегментный регистр DS, за ис­ключением случаев, когда в качестве базового регистра выступает регистр BP, в этом случае используется сегментный регистр SS.

ПРИМЕР ВЫПОЛНЕНИЯ РАБОТЫ

Дана формула: X = 3A + (B + 5)/2 – C – 1 .

A, B, C, X - целые знаковые числа, занимающие слово. Напи­сать программу, реализующую данную формулу.

Распишем формулу по отдельным операциям:

AX A значение А в регистр AX
AX 2*(AX) 2A в AX
AX (AX) + A 3A в AX
BX B B в BX
BX 5 + (BX) B+5 в BX
BX (BX)/2 (B+5)/2 в BX
AX (BX) + (AX) 3A+(B+5)/2 в AX
AX (AX) – C 3A+(B+5)/2–C в AX
AX (AX) – 1 3A+(B+5)/2–C–1 в AX
X (AX) 3A+(B+5)/2–C–1 в 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. В чем различие между командами:
mov AX, BX;
mov AX, [BX];
mov [AX], BX ?

9. Какая директива завершает текст программы ?

10. В чем различие между командой mov A, 1 и директивой A dw 1 ?

11. Пусть имя файла исходной программы – LAB.ASM . Что будут содержать файлы: LAB.OBJ, LAB.LST, LAB.EXE ?

12. Для чего используется отладчик ?

13. Как изменится содержимое AL и флагов после выполнения ко­манд
shr AL, 1 ;
sar AL, 1 ;
shl AL, 1 ;
sal AL, 1 ,
если AL = F2h ?


Лабораторная работа

 

ÖÈÊËÈ×ÅÑÊÈÅ È ÐÀÇÂÅÒÂËßÞÙÈÅÑß ÏÐÎÃÐÀÌÌÛ

ЦЕЛЬ РАБОТЫ

Цель настоящей работы – выработка навыков разработки простых циклических программ на языке ассемблера.

ОСНОВНЫЕ СВЕДЕНИЯ

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

Для выработки кода условия можно воспользоваться коман­дами 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 команд?


Лабораторная работа

 

 

ËÎÃÈ×ÅÑÊÈÅ ÊÎÌÀÍÄÛ

ЦЕЛЬ РАБОТЫ

Цель настоящей работы – освоение логических команд.

ОСНОВНЫЕ СВЕДЕНИЯ

Логические команды

К логическим командам или точнее командам, оперирующим с отдельными битами, можно отнести команды, приведенные ниже, а также команды сдвигов.

 

ÌÍÅÌÎÊÎÄ OSZAPC ДЕЙСТВИЕ
and DST, SRC xxxxxx поразрядное И, DSTDST & SRC
or DST, SRC xxxxxx поразрядное ИЛИ, DSTDST V SRC
xor DST, SRC xxxxxx поразрядное ИСКЛЮЧАЮЩЕЕ ИЛИ, DSTDSTÅSRC
test DST, SRC xxxxxx поразрядное И без запоминания результата
not OPND xxxxx- поразрядная инверсия, OPND ~OPND

Примеры использования логических команд

Установить 3 и 0 биты в регистре AL, остальные биты не изменять

or AL, 00001001b .

Сбросить 4 и 6 биты в регистре AL, остальные биты не изменять

and AL, 10101111b .

Проинвертировать 4 и 2 биты в регистре AL, остальные биты не изменять

xor AL, 00010100b .

Перейти на метку LAB, если установлен 4 бит регистра AL, в противном случае продолжить выполнение программы

test AL, 00010000b
jnz LAB
; продолжаем
...
LAB:

Посчитать число единиц в байте – регистре AL

mov CX, 8
xor BX, BX
LL: shl AL, 1
jnc NO
inc BX
NO: loop LL

ПРИМЕР ВЫПОЛНЕНИЯ РАБОТЫ

Дан массив из 10 байтов. Все байты имеют нулевые старшие биты. Необходимо каждый байт, содержащий 1 в 0-м бите, допол­нить до четного числа единиц установкой 7-го бита байта, каждый байт, содержащий 0 в 0-м бите, дополнить до нечетного числа единиц установкой 7-го бита байта.

Текст программы:


model SMALL

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. В паре строк
mov CL, 8
"сдвиг" BL, CL
какие команды можно подставить вместо "сдвиг", чтобы содержимое BL не изменилось ?

11. В паре строк
"сдвиг влево" BL, 1
"сдвиг вправо" BL, 1
какие команды можно подставить вместо "сдвиг влево" и "сдвиг вправо", чтобы содержимое BL не изменилось ?


Лабораторная работа

 

 

ÑÈÌÂÎËÜÍÀß ÎÁÐÀÁÎÒÊÀ

ЦЕЛЬ РАБОТЫ

Цель настоящей работы – освоение приемов обработки сим­вольной информации, функций 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. Что такое расширенный код клавиатуры?

5. Можно ли выдать на экран текст «$1.00 = 25.00 rub.», используя функцию DOS 09h?

6. Какие режимы адресации удобно использовать при работе с одномерными массивами ?

7. Что означают выражения в поле операндов в строках примера:
lea BX, INSTR+2
mov OUTSTR+3, AL ?

8. Как выделить младшую тетраду байта ?









Читайте также:

Последнее изменение этой страницы: 2016-03-25; Просмотров: 65;


lektsia.info 2017 год. Все права принадлежат их авторам! Главная