Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ASVT Материалы / АСВТ_метод_указ_пр_работ.doc
Скачиваний:
46
Добавлен:
29.03.2016
Размер:
178.69 Кб
Скачать

Лабораторная работа №2. Изучение регистров процессоров семейства x86 и работа с ними в программе Debug

Цель работы: изучить назначение регистров процессора 8086 и основные принципы использования регистров для управления работой процессора. Изучить способ сегментирования памяти процессора 8086. Изучить правила использования основных команд процессора 8086. Научиться составлять и выполнять простейшие программы с использованием отладчика Debug.

Задание 1. Регистры процессора 8086.

  • Запустите отладчик DEBUG. Для этого в командной строке введите команду debug. Приглашение отладчика «-». Для вывода списка команд отладчика введите символ «?».

  • Просмотр содержимого регистров. содержимое регистров выводится на экран по команде R:

-r

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=0ACA ES=0ACA SS=0ACA CS=0ACA IP=0100 NV UP EI PL NZ NA PO NC

0ACA:0100 3E DS:

0ACA:0101 62 DB 62

Назовите регистры общего назначения (РОН). Определите, какие значения в них записаны? Скопируйте результат в отчет. Для этого в левом верхнем углу окна отладчика откройте меню редактирования, выберите пункт «Пометить», выделите в окне на экране нужную область текста, выберите в меню пункт «Копировать», перейдите в окно блокнота, и выполните вставку.

  • Изменение значений в регистрах. Для записи данных в определенный регистр используется команда R <имя регистра>:

-r AX

AX 0000

:23

-r AX

AX 0023

:

  • Введите в РОН шестнадцатеричные числа 56h, 1F3h, D8h, AB1h. Просмотрите содержимое всех регистров. Внесите результат в отчет. Введите во все РОН нулевые значения. Проверьте содержимое регистров.

Задание 2. Размещение двухбайтовых инструкций процессора в ячейках памяти.

  • Из каких частей состоит адрес ячейки памяти в реальном режиме работы процессора? Укажите размер сегмента в адресуемой памяти процессора в реальном режиме. Какой наименьший сдвиг возможен между начальными байтами последовательных сегментов? Определите текущие адреса сегмента данных и сегмента кода.

  • Запись числа в память. Для записи числа в ячейку памяти используется команда E <смещение>:

Старое значение в памяти

-E 100

0ACA:0100 3E.01

Адрес сегмента

Записываемое значение

Смещение

-E 101

0ACA:0101 62.D8

-r

AX=0023 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=0ACA ES=0ACA SS=0ACA CS=0ACA IP=0100 NV UP EI PL NZ NA PO NC

0ACA:0100 01D8 ADD AX,BX

Из полученного результата видно, что отладчик интерпретирует двухбайтную инструкцию по адресу 0ACA:0100 как операцию сложения ADD значений регистров AX и BX. Для заполнения последовательных ячеек памяти используется команда E <смещение первой ячейки>. После ввода цифр первого числа нажмите пробел и вводите цифры второго числа и т.д.

  • Определите, с какого адреса должен начинаться сегмент данных, если сегмент кода имеет размер 64 кбайт. Установите нужное значение адреса сегмента данных. Введите в область сегмента данных последовательность чисел 10h,25h,1F,AC. В какой сегмент вводит значения отладчик, исполняя команду Е со смещением в качестве аргумента? Используйте формат команды E <сегмент>.<смещение> для ввода кода инструкции ADD в сегмент кода, начиная со смещения 0100.

Коды инструкций

Инструкция

Машинный код

Результат

сложения ADD AX,BX

01D8

AX

вычитания SUB AX,BX

29D8

AX

умножения BX на AX – MUL BX

F7E3

DX:AX (старшие:младшие биты)

деления DX:AX на BX – DIV BX

F7F3

AX- результат, DX- остаток

прерывание INT 21h

CD21

Вызов обработчика прерываний.

Задание 3. Указатель следующей инструкции.

  • Смещение адреса следующей инструкции в сегменте кода содержится в регистре IP. Для выполнения следующей инструкции процессором используется команда T. После ее выполнения значение IP увеличивается на 2, если выполненная инструкция не была инструкцией перехода.

  • Введите в регистр BX значение 1. Введите в сегмент кода инструкцию сложения со смещением 100. Установите IP на адрес введенной инструкции. Выполните сложение. Повторите инструкцию сложения еще трижды, каждый раз устанавливая соответствующий адрес в IP. Введите в регистр BX значение 2. Введите инструкцию умножения со смещением 102. Выполните эту инструкцию. Выполните инструкцию вычитания 3 раза подряд. Смещение вычитания 104. Выполните инструкцию деления (смещение 106). Вернитесь к инструкции вычитания и выполните её. Какое значение получено в регистре AX? Объясните его. Что изменилось в регистре флагов и почему?

Задание 4. Листинг сегмента кода.

  • Для просмотра содержимого сегмента кода используется команда U <начальное смещение>.

  • Выведите листинг сегмента кода со смещения 100. Скопируйте его в отчет. Разделите число7С4B12h на число 1С0. Чему равно частное и остаток? Чему равно произведение чисел 7C4Bh и 1A5?

Задание 5. Программные прерывания.

  • Параметры для обработчика прерываний, вызываемого инструкцией INT 21h, содержатся в РОН: AH- номер функции прерывания, DL-параметр для прерывания. Например, для вывода символа на экран используется функция 02h прерывания INT 21h, ASCII-код символа в регистре DL.

  • Прерывание INT 20h – корректное завершение работы программы и передача управления ОС. Параметров INT 20h не требует.

Коды инструкций

Инструкция

Машинный код

Результат

прерывание INT 21h

CD21

Вызов обработчика прерываний

прерывание INT 20h

CD20

Корректное завершение программы

  • Для выполнения последовательности инструкций в сегменте кода, начиная с той, на которую указывает IP, используется команда G <смещение останова >. Эту команду нужно использовать при выполнении прерывания, чтобы избежать его трассировки.

  • Введите код прерывания INT 21h со смещением 104, укажите номер прерывания 02h код символа 44h. Выполните инструкцию командой g от 104 до 106. Попробуйте объяснить полученный результат.

Задание 6. Использования инструкций простейших арифметических операций.

  • Выполните арифметические действия над шестнадцатеричными числами:

D2CF+A8=

2135+AF12=

BCAD-3124=

4561-345A=

FAx35=

FFxFF=

2346/AC= остаток=

EDFA/AD= остаток=

Поместите в отчет результаты вычислений.

Коды инструкций

Инструкция

Машинный код

Результат

сложения ADD AX,BX

01D8

AX

вычитания SUB AX,BX

29D8

AX

умножения BX на AX – MUL BX

F7E3

DX:AX (старшие: младшие биты)

Деления DX:AX на BX – DIV BX

F7F3

AX- результат, DX- остаток

Задание 7. Вывод символов на экран.

  • Используя прерывание 21, выведите на экран символы F, 3, d, 9, >, (. Для определения кода ASCII соответствующего символа используйте таблицу в приложении.

Задание 8. Деассемблирование.

  • Инструкция отладчика U <адрес> выводит инструкции, записанные в память, начиная с указанного адреса, в формате: <сегмент>:<смещение> <код инструкции> <команда ассемблера> <операнды>.

  • Введите в память, начиная со смещения 100, программу из 2 строк, которая выведет на экран символ A и завершит выполнение инструкцией INT 20h. Перед выполнением программы (команда отладчика G 104) проверьте правильность введенных кодов, выполнив деассемблирование. Поместите результат деассемблирования в отчёт.

Задание 9. Ассемблирование.

  • Инструкция отладчика A <адрес> позволяет вводить команды ассемблера, автоматически размещая их в соответствующем числе ячеек памяти, начиная с указанного адреса.

  • Введите, начиная с адреса 100, программу вывода на экран символа D:

INT 21

INT 20

Не забудьте установить значения регистров AH, DL

Поместите результат деассемблирования и значения регистров перед исполнением в отчёт.

Задание 10. Команда пересылки данных.

  • Составьте и введите в память, начиная со смещения 100, программу, которая загрузит в регистры соответствующие коды и выведет на экран символ @, после чего завершит выполнение и передаст управление отладчику. Выполните программу Поместите результат деассемблирования в отчет.

Коды инструкций

Инструкция

Машинный код

Результат

MOV AX,BX

89C3

BX копирует в AX

MOV AH,DL

88D4

DL копирует в AH

MOV AH,D2

B402

Загружает число D2 в :AH

Задание 11. Файлы.

  • Команда отладчика N <имя.расширение>позволяет создать файл с определенным именем.

  • Команда W позволяет записать число байт, указанное в CX, на диск в поименованный файл (в текущий каталог). BX при этом должен быть установлен в 0.

  • Запишите на диск в файл ch.com программу вывода на экран символа @. При выполнении из командной строки DOS программа должна выводить на экран символ @.

Задание 12. Вывод на экран строки символов.

  • Для того чтобы составить программу вывода строки из памяти, нужно воспользоваться функцией 09h прерывания INT 21h. Эта функция DOS выводит на экран последовательность символов до появления символа $ (24h). Смещение начала строки в сегменте данных указывает число в регистре DX.

  • Введите строку символов «Hello, Dolly!$» в память, начиная с со смещения 200, введите в память начиная со смещения 100 программу, которая загрузит в регистры коды прерывания 21 09, адрес строки в памяти (200). При помощи команды деассемблирования проверьте введенные коды программы.

  • Для проверки правильности введенных кодов символов строки используйте команду отладчика D <адрес>. Эта команда выводит на экран данные в формате <адрес-сегмент><адрес-смещение><строка кодов><строка символов>.

  • Определите длину программы (начиная со смещения 100) вместе со строкой символов (до первого символа после $).

  • Запишите программу в файл str.com. Проверьте ее работу, запустив из командной строки. Поместите файлы ch.com и str.com в отчёт.

Задание 13. Изучение флагового регистра.

  • Девять из 16 битов флагового регистра являются активными и определяют текущее состояние ЭВМ и результатов выполнения инструкции. Многие арифметические команды и команды сравнения изменяют состояние флагов. Для всех флагов 1 - истинно, 0 - ложно. Назначение флаговых битов:

Флаг

№ бита

0

1

Назначение

C (Перенос)

0

NC

CY

Содержит перенос из старшего бита, после арифметических операций, а также последний бит при сдвигах или циклических сдвигах.

O (Переполнение)

11

NV

OV

Указывает на переполнение старшего бита при арифметических командах.

D (Направление)

10

Обозначает левое или правое направление пересылки или сравнения строковых данных (данных в памяти превышающих длину одного слова).

I (Прерывание)

9

Указывает на возможность внешних прерываний

T (Пошаговый режим)

8

Обеспечивает возможность работы процессора в пошаговом режиме. На пример, программа DOS DEBUG устанавливает данный флаг так, что возможно пошаговое выполнение каждой команды для проверки изменения содержимого регистров и памяти.

S (Знак)

7

PL

NG

Содержит результирующий знак после арифметических операций (0 - плюс, 1 - минус).

Z (Ноль)

6

NZ

ZR

Показывает результат арифметических операций и операций сравнения (0 - ненулевой, 1 - нулевой результат).

A (Внешний перенос)

4

Содержит перенос из 3-го бита для 8-битных данных, используется для специальных арифметических операций.

P (Контроль четности)

2

Показывает четность младших 8-битовых данных (1 - четное и 0 - нечетное число).

При программировании на ассемблере наиболее часто используются флаги O, S, Z, и C для арифметических операций и операций сравнения, а флаг D для обозначения направления в операциях над строками.

  • Используя операцию вычитания, проанализируйте изменение значения флага Z в зависимости от равенства 0 результата операции. Проанализируйте изменение значения флага S в зависимости от знака результата операции вычитания.

  • Используя операцию сложения, проанализируйте изменение значения флага O в зависимости от того, привела ли операция к переполнению (несоответствующему изменению знакового флага S).

Задание 14. Циклический сдвиг влево с переносом.

  • Инструкция ассемблера RCL BL,1 производит сдвиг младшего байта регистра BX влево: переносит значение флага С в младший бит регистра и переносит значение старшего бита BL в флаг С, все остальные биты регистра смещаются на один влево.

  • Поместите инструкцию RCL BL,1 по адресу 100, занесите в регистр число B7, выполняйте инструкцию циклического сдвига, каждый раз записывая значения флага С и содержимого BL в шестнадцатеричном и двоичном формате в таблицу до восстановления исходного значения регистра.

С

Значения битов регистра BL

BL

7

6

5

4

3

2

1

0

Задание 15. Сложение с использованием флага переноса.

  • Инструкция ассемблера ADC AX,<слагаемое> складывает значения AX, слагаемого (значения регистра или напрямую указанного числа) и бит флага переноса. Результат помещается в AX.

  • Напишите инструкции, выполнение которых приведет к выводу на экран значения бита переноса в виде цифры (символы 0 и 1, соответствующие ASCII-коды 30h и 31h).

Задание 16. Использование оператора цикла.

  • Инструкция ассемблера LOOP <смещение> позволяет организовать циклическое исполнение инструкций, расположенных начиная со значения <смещение> до этой инструкции. В регистре CX определяется количество повторений, каждое выполнение инструкции LOOP уменьшает значение CX на 1.

  • Напишите программу, которая выводит на экран в двоичном представлении число, записанное в регистре BL.

Задание 17. Использование операций условных переходов.

  • Условный переход по значению Z:

JZ <смещение> - если результат последней арифметической операции – 0- переход по адресу <смещение>. В противном случае выполняется следующая операция;

JNZ <смещение> – переход по адресу в случае, если результат последней операции не нулевой.

  • Составьте программу обнуления регистра AX, в котором исходно записано некоторое число.

  • Перед использованием условных переходов необходимо установить значение требуемых флагов. Это можно сделать, например, с помощью инструкции ассемблера CMP AX,BX, работающей аналогично инструкции SUB AX,BX, но значения регистров не изменяющей.

  • Проанализируйте изменения флагов при сравнении разных чисел и составьте таблицу:

    AX

    BX

    Флаги-значения

  • Инструкция условного перехода JL <смещение> Переход, если меньше. Эта инструкция выполняет переход по <адресу>, если в результате выполнения предшествующей инструкции CMP первый операнд этой инструкции меньше, чем второй.

  • Инструкция условного перехода по условию «меньше или равно» JLE <адрес>. Переход по адресу выполняется, если в предшествующей операции сравнения CMP первый операнд меньше или равен второму.

  • Составьте блок-схему и напишите на ассемблере программу, которая берёт одну цифру младшего разряда из регистра BL (в BX записано число Аh) и выводит ее на экран (в шестнадцатеричном представлении). Блок-схему и текст программы вставьте в отчёт.

Задание 18. Использование операций сдвигов.

  • Инструкция сдвига вправо SHR DL,CL DL-это младший байт регистра DX, сдвиг вправо в котором нужно выполнить. CL- это счетчик сдвига. В этом регистре указано число бит, на который производится сдвиг в регистре DL.

  • Инструкция сдвига влево – арифметический сдвиг SHL DL,CL. В регистр CL предварительно записывается число бит сдвига. Содержимое DL сдвигается влево, справа вставляются нули.

  • Занесите в регистр DX число 72h. Проанализируйте результат выполнения оператора SHR DL,CL при значениях в регистре CL равных 1, 2,4, представьте результат в виде таблиц. CL=

    № выполнения сдвига

    Биты DL

    Флаг C

    7

    6

    5

    4

    3

    2

    1

    0

  • Какой сдвиг нужно выполнить, чтобы перевести цифру старшего разряда числа 72h в позицию младшего разряда? Какая цифра будет при этом записана в старшем разряде числа BL?

Задание 19. Использование логических операций.

  • AND <регистр>,<операнд>.Операция выполняет побитовое логическое сложение операндов и заносит результат в регистр.

  • Каким будет результат логического сложения числа 0Fh и каким-либо двузначным числом?

  • Составьте блок-схему и программу, которая выводит на экран двузначное число из регистра BL, записанное в шестнадцатеричном формате. Блок-схему и текст программы вставьте в отчёт.

Задание 20. Ввод символов с клавиатуры.

  • Для отладки и редактирования существующей на диске программы используется команда DOS: debug <имя файла>. Сохранённый с помощью отладчика файл в формате com загружается в сегмент кода со смещением 100.

  • Для считывания символа, введённого с клавиатуры, используется прерывание DOS INT 21h функция 01h. Номер функции определяется по регистру AH. ASCII-код символа нажатой клавиши помещается в регистр AL.

  • Напишите код, выполняющий загрузку регистра AH и ввод с клавиатуры символа в регистр AL.

  • Составьте программу, записывающую в регистр AL шестнадцатеричную цифру, введённую с клавиатуры.

  • Составьте блок-схему и программу ввода в регистр BX двухзначного числа с клавиатуры.

  • Блок-схему и файл программы вставьте в отчет.

Задание 21. Использование процедур.

  • CALL <адрес> - операция вызова процедуры, расположенной по <адресу>. Это значит, что в ячейке памяти <адрес> расположен код первой инструкции процедуры. Управление передаётся по этому адресу.

  • RET – операция завершения процедуры и перехода к инструкции, следующей за инструкцией CALL. Операция является последней в последовательности операций процедуры.

  • Напишите процедуру, выполняющую вывод символа (код в регистре DL), и увеличение выводимого кода на 1. Разместите процедуру, начиная со смещения 200.

  • Начиная со смещения 100, разместите программу, которая выведет на экран 14 символов начиная с цифры 2, с использованием процедуры по адресу 200. Запишите программу в файл. Текст программы вставьте в отчёт.

Задание 22. Организация и использование стека.

  • Стек строится по логике LIFO. Регистр SS содержит номер сегмента стека, регистр SP – номер указателя стека – адрес вершины стека. Для записи значения регистра в стек используется операция PUSH <регистр>. Для извлечения числа из стека в регистр используется операция POP <регистр>.

  • Составьте блок-схему и программу, которая позволяет занести в стек последовательность из 10 шестнадцатеричных чисел. Используйте в качестве процедуры написанную в работе 4 программу ввода чисел.

  • Выведите дамп стека после выполнения ввода.

  • Блок-схему и текст программы вставьте в отчёт.