\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{10.05.01 "--- Компьютерная безопасность} % Для студентки. Для работы студента следующая команда не нужна. % \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}