\documentclass[bachelor, och, labwork]{SCWorks}
% параметр - тип обучения - одно из значений:
%    spec     - специальность
%    bachelor - бакалавриат (по умолчанию)
%    master   - магистратура
% параметр - форма обучения - одно из значений:
%    och   - очное (по умолчанию)
%    zaoch - заочное
% параметр - тип работы - одно из значений:
%    referat    - реферат
%    coursework - курсовая работа (по умолчанию)
%    diploma    - дипломная работа
%    pract      - отчет по практике
% параметр - включение шрифта
%    times    - включение шрифта Times New Roman (если установлен)
%               по умолчанию выключен

\usepackage{subfigure}
\usepackage{tikz,pgfplots}
\pgfplotsset{compat=1.5}
\usepackage{float}

%\usepackage{titlesec}
\setcounter{secnumdepth}{4}
%\titleformat{\paragraph}
%{\normalfont\normalsize}{\theparagraph}{1em}{}
%\titlespacing*{\paragraph}
%{35.5pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}

\titleformat{\paragraph}[block]
{\hspace{1.25cm}\normalfont}
{\theparagraph}{1ex}{}
\titlespacing{\paragraph}
{0cm}{2ex plus 1ex minus .2ex}{.4ex plus.2ex}

% --------------------------------------------------------------------------%


\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\graphicspath{ {./images/} }
\usepackage{tempora}

\usepackage[sort,compress]{cite}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{fancyvrb}
\usepackage{listings}
\usepackage{listingsutf8}
\usepackage{longtable}
\usepackage{array}
\usepackage[english,russian]{babel}

\usepackage[colorlinks=true]{hyperref}
\usepackage{url}


\newcommand{\eqdef}{\stackrel {\rm def}{=}}

\renewcommand\theFancyVerbLine{\small\arabic{FancyVerbLine}}

\newtheorem{lem}{Лемма}

\begin{document}

% Кафедра (в родительном падеже)
\chair{}

% Тема работы
\title{Отчет по дисциплине ``Аппаратные средства вычислительной техники'' по лабораторной работе \#3}

% Курс
\course{1}

% Группа
\group{131}

% Факультет (в родительном падеже) (по умолчанию "факультета КНиИТ")
\department{факультета КНиИТ}

% Специальность/направление код - наименование
%\napravlenie{09.03.04 "--- Программная инженерия}
%\napravlenie{010500 "--- Математическое обеспечение и администрирование информационных систем}
%\napravlenie{230100 "--- Информатика и вычислительная техника}
%\napravlenie{231000 "--- Программная инженерия}
\napravlenie{090301 "--- Компьютерная безопасность}

% Для студентки. Для работы студента следующая команда не нужна.
% \studenttitle{Студентки}

% Фамилия, имя, отчество в родительном падеже
\author{Гущина Андрея Юрьевича}

% Заведующий кафедрой
% \chtitle{} % степень, звание
% \chname{}

%Научный руководитель (для реферата преподаватель проверяющий работу)
\satitle{доцент} %должность, степень, звание
\saname{О. В. Мещерякова}

% Руководитель практики от организации (только для практики,
% для остальных типов работ не используется)
% \patitle{к.ф.-м.н.}
% \paname{С.~В.~Миронов}

% Семестр (только для практики, для остальных
% типов работ не используется)
%\term{8}

% Наименование практики (только для практики, для остальных
% типов работ не используется)
%\practtype{преддипломная}

% Продолжительность практики (количество недель) (только для практики,
% для остальных типов работ не используется)
%\duration{4}

% Даты начала и окончания практики (только для практики, для остальных
% типов работ не используется)
%\practStart{30.04.2019}
%\practFinish{27.05.2019}

% Год выполнения отчета
\date{2020}

\maketitle

% Включение нумерации рисунков, формул и таблиц по разделам
% (по умолчанию - нумерация сквозная)
% (допускается оба вида нумерации)
% \secNumbering

\section{Задание 1}

\textit{
    Напишите программу в формате exe, выводящую в шестнадцатеричном виде дамп 
    самой (коды) себя напрямую в видеобуфер (адрес B8000h) в текстовом режиме. 
    Программа должна восстанавливать экран после закрытия.
}

Для выполнения задания я разделил программу на три процедуры:

\begin{itemize}
    \item \textbf{printWord} -- для вывода символа дампа программы
    \item \textbf{clearScreen} -- для очистки экрана и сохранения его массив
    \item \textbf{restoreScreen} -- для восстановления экрана после окончания программы
\end{itemize}

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

\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\textwidth]{start_label.png}
    \caption{Основная часть программы}
    \label{}
\end{figure}

В процедуре clearScreen я записываю текущее состояние видеопамяти в буфер screenArr.
Сразу после этого записываю в видеопамять нули, чтобы очистить экран.

\begin{figure}[H]
    \centering
    \includegraphics[width=0.7\textwidth]{clear_screen.png}
    \caption{clearScreen}
    \label{}
\end{figure}

Дамп программы находится в регистре cs (Code segment). Последовательно читаем то
количество байт, которое мы вычислили в начале программы и выводим их по одному 
с помощью процедуры printWord.

В ней мы переводим байты в соответствующие символы по таблице ASCII.
Цифры в таблице начинаются со значения 30h, а буквы со значения 41h.

\begin{figure}[H]
    \centering
    \includegraphics[width=0.6\textwidth]{print_word.png}
    \caption{printWord}
    \label{}
\end{figure}

После вывода дампа приостановим программу с помощью функции 07h прерывания 21h
(Ожидания нажатия на любую кнопку).

После этого вызовем функцию restoreScreen, чтобы восстановить экран в прежнее состояние.
Для этого надо записать в видеопамять значения из буфера screenArr, в который мы записывали
видеопамять в процедуре clearScreen.

\begin{figure}[H]
    \centering
    \includegraphics[width=0.6\textwidth]{restore_screen.png}
    \caption{restoreScreen}
    \label{}
\end{figure}

Пора запустить программу!

Проассемблируем и слинкуем программу, чтобы создать .exe файл.

\begin{figure}[H]
    \centering
    \includegraphics[width=0.7\textwidth]{compile.png}
    \caption{Компилируем...}
    \label{}
\end{figure}

Запустил программу с помощью команды VDUMP.EXE и получил дамп этой же программы.

\begin{figure}[H]
    \centering
    \includegraphics[width=0.7\textwidth]{run.png}
    \caption{Читаем дамп}
    \label{}
\end{figure}

Получил строку из символов, которая начинается с 51B902...
Интересно получилось.

После того, как я нажал на кнопку Enter программа закрылась, а экран
вернулся в то состояние, в котором было до запуска. И тут даже появилась
введенная команда запуска этой программы!

\begin{figure}[H]
    \centering
    \includegraphics[width=0.7\textwidth]{exited.png}
    \caption{Вернулись домой!}
    \label{}
\end{figure}

Попробовал получить дамп программы, которая работает у меня в голове и получилось вот это:

\begin{figure}[H]
    \centering
    \includegraphics[width=0.7\textwidth]{mydump.jpg}
    \caption{}
    \label{}
\end{figure}

\end{document}
