Лабораторная 3 (2 сем)
.docxСанкт-Петербургский политехнический университет Петра Великого
Институт компьютерных наук и технологий
Высшая школа интеллектуальных систем и суперкомпьютерных технологий
ЛАБОРАТОРНАЯ РАБОТА №3
«Дизассемблирование программы bloop.com»
по дисциплине «Архитектура вычислительных систем»
Выполнил
студент гр. 3530903/80001 А. В. Шильникова
Руководитель Н. М. Вербова
«___» __________ 2021 г.
Санкт-Петербург
2021
Цель работы: изучить элементы и принципы процедуры дизассемблирования программ.
Задачи:
1. Исследовать работу программы bloop.com.
2. Дизассемблировать программу bloop.com.
3. Составить комментарий к программе.
Код программы BLOOP.COM в редакторе WinHex
Дизассемблированный код программы BLOOP.COM
50 |
push ax |
запись ax в стек |
51 |
push cx |
запись cx в стек |
B0 B6 |
mov al, data8 (B6) |
запись 0xB6 в регистр al B6 = 1011 0110 0 – константа пересчета задана двоичным числом 011 – режим работы микросхемы таймера 11 – записать в регистр-фиксатор сначала старший байт, затем младший 10 – номер канала (2) |
E6 43 |
out al, port (43) |
передача al в устройство 0x43 (канал управления таймера) |
B0 00 |
mov al, data8 (00) |
запись 0x00 в al |
E6 42 |
out al, port (42) |
передача al в устр-во 0x42 (упр-е динамиком) |
B0 0A |
mov al, data8 (0A) |
запись 0x0A в al Вместе с предыдущей записью в al хранится 0хА00 |
E6 42 |
out al, port (42) |
передача al в устр-во 0x42 (упр-е динамиком) |
E4 61 |
in al, port (61) |
считывание из порта 61 (динамик) в регистр al |
50 |
push ax |
запись ax в стек |
0C 03 |
or al, data8 (03) |
логическое или значения 0x03 и регистра al (включение динамика) 3 = 11 => установление двух старших битов в единицы |
E6 61 |
out al, port (61) |
передача al в устройство 0x61 |
B9 00 40 |
mov cx, data16 (0x4000h) |
запись 0x4000 в cx в качестве счётчика цикла |
E2 FE |
loop short_tag (FE) |
цикл (нужен для задержки звука) FE = 1111 1110 (доп. код -1 = 1111 1101, затем инвертируем все биты => 10) Итого loop -2 |
58 |
pop ax |
получение ax из стека |
E6 61 |
out al, port (61) |
передача al устройству 0x61 (отключение динамика) |
59 |
pop cx |
получение cx из стека |
58 |
pop ax |
получение ax из стека |
B8 00 4C |
mov ax, data16 (4C00) |
запись 0x4C00 в ax |
CD 21 |
int, n_proc (21) |
прерывание с кодом 21 (выход из программы) |
Порты ввода-вывода это – логические номера, через которые центральный процессор
обращается к внешним устройствам. Порты это – аналог адресов оперативной памяти,
только относящиеся к внешним устройствам. Из порта можно читать информацию и
записывать в него.
Для работы с портами ввода-вывода из ассемблера существуют команды процессора IN и
OUT. Они позволяют отправлять в шину данные и читать из шины. Для отправки байта в
порт ввода-вывода нужно записать отправляемое значение в регистр AL/AX/EAX и
вызвать команду OUT.
Порты 42h и 43h
Нужны для взаимодействия с Программируемым Интервальным Таймером (ПИТ).
Программируемый интервальный таймер (Programmable Interval Timer, PIT) —
интегральная микросхема, предназначенная для организации ввода/вывода
числоимпульсной информации и формирования временных интервалов между
импульсами.
ПИТ включает в себя три независимых таймера-счётчика (16–разрядных канала с общей
схемой управления):
0-й Счётчик (канал) - для генерации прерываний по линии IRQ0 и называется
системным таймером;
1-й Счётчик (канал) — для генерации запросов на регенерацию динамической
оперативной памяти компьютера (в настоящее время в нём нет необходимости, т.к.
схемы регенерации входят в состав самих микросхем памяти – внешняя логика
больше не нужна);
2-й Счётчик (канал) — для генерации звука определённой частоты на системном
динамике.
ПИТ также имеет управляющие входы GATE и GATE2, участвующие в работе портов 42h
и 61h соответственно. Высокий уровень сигнала на входе GATE разрешает счёт для 2-го
Счётчика. Счет для 0-го и 1-го каналов разрешен постоянно.
Порт 61h
Нужен для управления звуком. В частности, чтобы подавать сигналы определенной
длительности, разрешая/запрещая формирование сигнала с помощью
программно-управляемого 1-го бита. Такой способ позволяет формировать звук даже в
фоновом режиме, посылая команды из очереди по прерываниям от системного таймера.
Таймер генерирует выходной сигнал при высоком уровне на входе GATE2 (при единичном
значении 0-го бита порта 61h).
Как рассчитать ноту: частота ноты находится по формуле (1193180 / делитель). Значение делителя – значение регистра al, который передается на порт 0х42. У нас это 0хА00 – 2560. Так частота приблизительно 466 Гц, а нота ля-диез первой октавы.
Вывод: на примере данной программы были отработаны навыки дизассемблирования программ и изучена работа с устройствами из ассемблера.