- •075200 – «Компьютерная безопасность»,
- •Лабораторная работа №1. Изучение характеристик и настройка системных плат эвм и накопителей информации на жестких дисках (hdd)
- •Лабораторная работа №2. Изучение регистров процессоров семейства x86 и работа с ними в программе Debug
- •Лабораторная работа №3. Освоение разработки программ и программирование системных ресурсов эвм с архитектурой ibm pc в среде графического программирования LabView 8.5
Лабораторная работа №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
0

ACA: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 программу ввода чисел.
-
Выведите дамп стека после выполнения ввода.
-
Блок-схему и текст программы вставьте в отчёт.
