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

Лабораторная 3 (2 сем)

.docx
Скачиваний:
4
Добавлен:
18.07.2022
Размер:
39.58 Кб
Скачать

Санкт-Петербургский политехнический университет Петра Великого

Институт компьютерных наук и технологий

Высшая школа интеллектуальных систем и суперкомпьютерных технологий

ЛАБОРАТОРНАЯ РАБОТА №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 Гц, а нота ля-диез первой октавы.

Вывод: на примере данной программы были отработаны навыки дизассемблирования программ и изучена работа с устройствами из ассемблера.