
- •Л Составитель: преп.Каф.ИнформатикиАркабаев Нуркасым Кылычбековичабораторная работа №1 Начало работы на языке ассемблера
- •Теоретическая часть
- •Int 21h
- •Int 21h
- •Задание
- •Контрольные вопросы.
- •Лабораторная работа №2 д Составитель: преп.Каф.ИнформатикиАркабаев Нуркасым Кылычбековичирективы языка ассемблера
- •Теоретическая часть
- •Задания (2 часа)
- •Int 21h
- •Int 21h
- •Контрольные вопросы
- •Лабораторная работа №3 к Составитель: преп.Каф.ИнформатикиАркабаев Нуркасым Кылычбековичоманды пересылки данных. Стек.
- •Теоретическая часть
- •Команды пересылки данных
- •Задание
- •Контрольные вопросы:
- •Лабораторная работа №4 а Составитель: преп.Каф.ИнформатикиАркабаев Нуркасым Кылычбековичрифметические операции. Битовые команды.
- •Теоретическая часть
- •Битовые команды
- •Задание
- •X dw ?
- •Int 21h
- •Int 21h
- •Контрольные вопросы:
- •Теоретическая часть
- •Задание
- •1. Предварительная подготовка
- •2 Порядок выполнения работы на эвм
- •Контрольные вопросы:
- •С Составитель: преп.Каф.ИнформатикиАркабаев Нуркасым Кылычбековичтроковые функции и массивы (4 часа).
- •Теоретическая часть Строковые инструкции
- •Инициализация массивов
- •Задание
- •Контрольные вопросы:
- •Лабораторная работа №7 п Составитель: преп.Каф.ИнформатикиАркабаев Нуркасым Кылычбековичроцедуры.
- •Теоретическая часть
- •Работа команд ret и retf
- •Задание
- •Программа №7.1
- •Контрольные вопросы
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 и ввести правильный оператор.
Контрольные вопросы:
С какими операциями используется команда JUMP?
Назовите сходство и различия команд перехода для знаковых и беззнаковых команд?
Расскажите принцип работы операторов цикла.
Можно ли организовать цикл без команд LOOP ?
К какому типу переход (дальние, короткие) относятся условные переходы ?
Как влияет команда CMP на регистр флагов ?
Можно ли заменить в программе команду 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, который вместо копирования одной ячейки памяти в другую сравнивает две ячейки памяти.