Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
97
Добавлен:
11.02.2014
Размер:
310.27 Кб
Скачать

2 Порядок выполнения работы на эвм

1. С помощью текстового редактора ввести текст программы и записать в файл с уникальным именем.

2. Протранслировать программу:

tasm/zi имя_файла,имя_файла

3. Создать выполняемый exe-файл:

tlink/v имя_файла,имя_файла

4. Загрузить отладчик:

td

Отладить программу, выполняя ее по шагам (F8).

5. Показать преподавателю работу отлаженной программы.

ПРИМЕЧАНИЯ

1.Посмотреть выведенное программой сообщение можно на экране пользователя после нажатия клавиш Alt+F5; возврат в отладчик - Alt+F5.

2.При необходимости изменения содержимого сегмента данных следует нажимать клавишу Tab до тех пор, пока курсор не окажется в окне DUMP, подвести курсор к нужному элементу данных, ввести новое значение, нажать клавишу Enter, нажать клавишу Tab для возврата курсора в раздел сегмента кода программы.

3.Чтобы не повторять трансляцию при обнаружении каждой ошибки, можно исправлять отдельные операторы, не выходя из отладчика. Для этого надо установить курсор на ошибочный оператор, вызвать локальное меню, дать команду ASSEMBLE и ввести правильный оператор.

Контрольные вопросы:

  1. С какими операциями используется команда JUMP?

  2. Назовите сходство и различия команд перехода для знаковых и беззнаковых команд?

  3. Расскажите принцип работы операторов цикла.

  4. Можно ли организовать цикл без команд LOOP ?

  5. К какому типу переход (дальние, короткие) относятся условные переходы ?

  6. Как влияет команда CMP на регистр флагов ?

  7. Можно ли заменить в программе команду JL на команду JB ?

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

С Составитель: преп.Каф.ИнформатикиАркабаев Нуркасым Кылычбековичтроковые функции и массивы (4 часа).

Цель работы:

  • изучить команды перемещения данных;

  • изучить команды повторения строковых инструкций;

  • научить организацию массивов на ассемблере;

Теоретическая часть Строковые инструкции

Строковые инструкции отличаются от прочих инструкций процессора 8086. Они могут (в одной инструкции) обращаться к памяти и увеличивать или уменьшать регистр-указатель. Одна строковая инструкция может обращаться к памяти 130000 раз.

Строковые инструкции перемещения данных

Строковые инструкции перемещения данных во многом аналогичны инструкции MOV, но могут выполнять больше функций, чем инструкция MOV и работают быстрее. Мы рассмотрим сначала инструкцию LODS.

Инструкция LODS

Инструкция LODS, которая загружает байт или слово из памяти в аккумулятор(накопитель), подразделяется на две инструкции LODSB и LODSW. Инструкция LODSB загружает байт, адресуемый с помощью пары регистров DS:SI, в регистр AL и уменьшает или увеличивает регистр SI (в зависимости от состояния флага направления). Если флаг направления равен 0 (установлен с помощью инструкции CLD), то регистр SI увеличивается, а если флаг направления равен 1 (установлен с помощью инструкции STD), то регистр SI уменьшается. И это верно не только для инструкции LODSB, флаг направления управляет направлением, в котором изменяются все регистры-указатели строковых инструкций.

Например, в следующем фрагменте программы:

...

cld

mov si,0

lodsb

инструкция LODSB загружает регистр AL содержимым байта со смещением 0 в сегменте данных и увеличивает значение регистра SI на 1.

Это эквивалентно выполнению следующих инструкций:

...

mov si,0

mov al,[si]

inc si

...

Инструкция LODSW аналогична инструкции LODSB. Она сохраняет в регистре AX слово, адресуемое парой регистров DS:SI, а значение регистра SI уменьшается или увеличивается на 2, а не на 1.

Инструкция STOS

Инструкция STOS - это дополнение инструкции LODS. Она записывает значение размером в байт или слово из аккумулятора в ячейку памяти, на которую указывает пара регистров ES:DI, а затем увеличивает или уменьшает DI. Инструкция STOSB записывает байт, содержащийся в регистре AL, в ячейку памяти по адресу ES:DI, а затем увеличивает или уменьшает регистр DI, в зависимости от флага направления.

Например, инструкции:

...

std

mov di,0ffffh

mov al,55h

stosb

...

записывают значение 55h в байт со смещением 0FFFFh в сегменте, на который указывает регистр ES, а затем уменьшает DI до значения 0FFFEh.

Инструкция MOVS

Инструкция MOVS аналогична инструкциям LODS и STOS, если их объединить в одну инструкцию. Эта инструкция считывает байт или слово, записанное по адресу DS:SI, а затем записывает это значение по адресу, определяемому парой регистров ES:DI. Слово или байт не передается при этом через регистры, поэтому содержимое регистра AX не изменяется. Инструкция MOVSB имеет минимально возможную для инструкции длину. Она занимает только один байт, а работает еще быстрее, чем комбинация инструкций LODS и STOS. С применением инструкции MOVS последний пример приобретает вид:

..

mov cx,ARRAY_LENGTH_IN_WORDS

mov si,OFFSET SourceArray

mov ax,SEG SourceArray

mov ds,ax

mov di,OFFSET DestArray

mov ax,SEG DestArray

mov es,ax

cld

CopyLoop:

movsw

loop CopyLoop

...

Повторение строковой инструкции

Префикс повторения REP - это не инструкция, а префикс инструкции. Префикс инструкции изменяет работу последующей инструкции. Префикс REP делает следующее: он указывает, что последующую инструкцию нужно повторно выполнять до тех пор, пока содержимое регистра CX не станет равным 0. (Если регистр CX равен 0 в начале выполнения инструкции, то инструкция выполняется 0 раз, другими словами, никаких действий не производится.)

Используя префикс REP, можно заменить в последнем примере инструкции:

CopyLoop:

movsw

loop CopyLoop

на инструкцию:

rep movsb

Эта инструкция будет перемещать блок из 65535 слов (0FFFFh) из памяти, начинающейся с адреса DS:SI в память, начинающуюся с адреса, определяемого регистрами ES:DI.

Префикс REP можно использовать не только с инструкцией MOVS, но также и с инструкциями LODS и STOS.

Поиск данных с помощью строковой инструкции

Инструкция SCAS

Инструкция SCAS используется для просмотра памяти и поиска совпадения или несовпадения с конкретным значением размером в байт или слово. Как и все строковые инструкции, инструкция SCAS имеет две формы - SCASB и SCASW.

Инструкция SCASB сравнивает содержимое регистра AL с байтовым значением по адресу ES:DI, устанавливая при этом флаги, отражающие результат сравнения (как при выполнении инструкции CMP).

Как и при выполнении инструкции STOSB, при выполнении инструкции SCASB увеличивается или уменьшается значение регистра DI. Например, в следующем фрагменте программы находится первое t (строчная буква) в строке TextString:

...

.DATA

TextString DB 'Test text',0

TEXT_STRING_LENGTH EQU ($-TextString) ; длина строки

...

.CODE

...

mov ax,@Data

mov es,ax

mov di,OFFSET TextString ; ES:DI указывает

; на начало строки

; TextString

mov al,'t' ; искомый символ

mov cx,TEXT_STRING_LENGTH ; длина просматриваемой

строки

cld ; увеличивать DI

; при просмотре

Scan_For_t_Loop:

csasb ; ES:DI совпадает c AL?

je Found_t ; да, мы нашли "t"

loop Scan_For_t_Loop ; нет, анализировать

; следующий символ

; Символ "t" не найден

...

; Символ "t" найден

Fount_t:

dec di ; ссылка обратно на

; смещение "t"

...

Заметим, что в данном примере после того, как найден символ t, регистр DI увеличен, что отражает выход указателя за границы строки (как мы уже обсуждали это ранее). Когда в данной программе успешно выполняется последняя инструкция SCASB, после сравнения DI увеличивается, поскольку последнее действие строковой инструкции состоит в увеличении указателя (указателей). В результате регистр DI указывает на байт после символа t и его нужно выровнять, чтобы компенсировать этот выход за пределы найденного символа и сделать так, чтобы он указывал на t.

Как и все строковые инструкции, инструкция SCAS увеличивает регистр-указатель DI, если флаг направления равен 0 (очищен с помощью инструкции CLD), и увеличивает DI, если флаг направления равен 1 (установлен с помощью инструкции STD).

Инструкция SCASW - это форма инструкции SCASB для работы со словом. Она сравнивает содержимое регистра AX с содержимым памяти по адресу ES:DI и увеличивает или уменьшает значение регистра DI в конце каждого выполнения на 2, а не на 1.

Инструкция CMPS

Инструкция CMPS позволяет выполнять сравнение двух байт или слов. При одном выполнении инструкции CMPS сравниваются две ячейки памяти, а затем увеличиваются регистры SI и DI. Инструкцию CMPS можно рассматривать, как аналог инструкции MOVS, который вместо копирования одной ячейки памяти в другую сравнивает две ячейки памяти.

Соседние файлы в папке лабораторные работы по ASSAMBLER