Загрузил Michael Muzicenko

Курсовая работа испр

реклама
Государственное образовательное учреждение высшего профессионального
образования
Кубанский государственный технологический университет
(КубГТУ)
РЕФЕРАТ
Пояснительная записка курсовой работе 40 страниц, 21 рисунок,
5 источников
АССЕМБЛЕР, КОМАНДЫ МИКРОПРОЦЕССОРА, РЕГИСТРЫ,
КОМАНДЫ СДВИГОВ, АЛГОРИТМ, СТРОКА, ДАМП ПАМЯТИ, КАДР,
КАНАЛЬНЫЙ ФАЙЛ, ФЛАГИ, ШЕСТНАДЦАТЕРИЧНАЯ СИСТЕМА
СЧИСЛЕНИЯ, ФУНКЦИИ DOS, СМЕЩЕНИЕ, СТЕК, ПОСТРОЕНИЕ
ГРАФИКА.
Объектом исследования являются методы программирования на
низком компьютерном уровне программирования на языке Assembler и
регистры микропроцессора.
Цель работы заключается в закрепление основ и углубление знаний в
области программирования микропроцессоров, получении практических
навыков в создании программного продукта
К полученным результатам относятся разработка программы
преобразования информации данной в дампе памяти в канальный файл и
построение графика канального файла.
3
Содержание
Введение ............................................................................................................ 6
1 Постановка задачи ......................................................................................... 7
1.1 Основная программа ................................................................................... 7
1.2 Программа построение графика ................................................................ 7
2 Краткие теоретические сведения ................................................................ 8
2.1 Ассемблер, язык ассемблера ...................................................................... 8
2.2 Ассемблеры для DOS ................................................................................. 8
3 Разработка алгоритма программы.............................................................. 10
3.1 Поэтапный алгоритм программы ............................................................ 10
3.2 Построение графика ................................................................................. 17
4 Разработка программы ................................................................................ 18
4.1 Описание команд микропроцессора ....................................................... 18
4.1.1 Команды пересылки и загрузки............................................................ 18
4.1.2 Арифметические команды .................................................................... 19
4.1.3 Циклический сдвиг ................................................................................ 20
4.1.4 Циклы ...................................................................................................... 20
4.1.5 Синтаксис процедуры............................................................................ 21
4.1.6 Операции над битами и байтами .......................................................... 21
4.1.7 Команда сравнения и условного перехода .......................................... 21
4.1.8 Префиксы ................................................................................................ 22
4.2 Регистры общего назначения................................................................... 23
4.2.1 Индексные регистры.............................................................................. 25
4.2.2 Сегментные регистры ............................................................................ 25
4.4 Описание используемых функций .......................................................... 25
4.5 Описание процедур программы .............................................................. 26
4.5.1 Начало .................................................................................................... 26
4.5.2 Процедура открытия файла “Uk64.dat” ............................................... 26
4.5.3 Процедура чтения заданного варианта ................................................ 26
4.5.4 Процедура поиска нулевой строки ...................................................... 27
4.5.5 Процедура записи в файл “My.dat” ...................................................... 27
4
4.5.6 Процедура создания и записи канального файла ............................... 27
4.5.7 Завершение программы ......................................................................... 28
4.6 Описание программы разработанной на языке C#................................ 28
5 Результат выполнения программы ............................................................ 30
5.1 My.dat ......................................................................................................... 30
5.2 Result.dat..................................................................................................... 31
5.3 Карта памяти ............................................................................................ 31
5.4 График ........................................................................................................ 32
Заключение ...................................................................................................... 33
Список используемых источников................................................................ 34
Приложение 1 - Код основной программы .................................................. 35
Приложение 2 – Код программы построения графика ............................... 40
5
Введение
Курсовой проект (программа) был разработан на языке ассемблер
с использованием средств этого языка. Язык ассемблер позволяет
работать с компьютером на низшем уровне, то есть с микропроцессором.
Язык ассемблера является символическим представлением машинного
языка, он неразрывно связан с архитектурой самого процессора. По мере
внесения изменений в архитектуру процессора совершенствуется и сам
язык ассемблера. График построен на языке C# . В пояснительной записке
представлен листинг программы, алгоритм с описанием, результаты
компиляции программы.
6
1 Постановка задачи
1.1 Основная программа
Особенность задачи заключается в том, чтобы программа была
написана на языке программирования ассемблер, так как в программе
приходится работать с регистрами микропроцессора, со словами, с
извлечением нужных байтов из них, а из последних, нужных битов.
Также необходимо построить график, который отображает зависимость
байта в шестнадцатеричной системе счисления от его номера в
конечном файле.
При выполнении курсовой работы использовать операционную
систему
Windows, инструментальные программы ассемблер (TASM,
MASM). Для графических построений можно использовать C#.
Согласно номеру варианта 14 данного курсового проекта, номера
байтов - 23 и 25, номера битов, которые необходимо извлечь, - 1 и 7,
соответственно.
1.2 Программа построение графика
Написать программу, которая строит график сформированных слов,
находящихся в файле Result.dat. На оси x откладываются номера байтов, на
оси y их значения
7
2 Краткие теоретические сведения
2.1 Ассемблер, язык ассемблера
Ассемблер (assembler) — компьютерная программа, компилятор
исходного текста программы, написанной на языке ассемблера, в программу
на машинном языке.
Как и сам язык (ассемблер), ассемблеры, как правило, специфичны
конкретной архитектуре, операционной системе и варианту синтаксиса
языка. Вместе с тем существуют мультиплатформенные или вовсе
универсальные (точнее, ограниченно-универсальные, потому что на языке
низкого уровня нельзя написать аппаратно-независимые программы)
ассемблеры, которые могут работать на разных платформах и операционных
системах. Среди последних можно также выделить группу кроссассемблеров, способных собирать машинный код и исполняемые модули
(файлы) для других архитектур и ОС.
Ассемблирование может быть не первым и не последним этапом на
пути получения исполнимого модуля программы. Так, многие компиляторы с
языков программирования высокого уровня выдают результат в виде
программы на языке ассемблера, которую в дальнейшем обрабатывает
ассемблер. Также результатом ассемблирования может быть не исполнимый,
а объектный модуль, содержащий разрозненные и непривязанные друг к
другу части машинного кода и данных программы, из которого (или из
нескольких объектных модулей) в дальнейшем с помощью программыкомпоновщика («линкера») может быть скомпонован исполнимый файл.
2.2 Ассемблеры для DOS
Наиболее известными ассемблерами для операционной системы DOS
являлись Borland Turbo Assembler (TASM), Microsoft Macro Assembler
(MASM) и Watcom Assembler (WASM). Также в своё время был популярен
простой ассемблер A86.
При появлении операционной системы Windows появилось
расширение TASM, именуемое TASM 5+ (неофициальный пакет),
позволившее создавать программы для выполнения в среде Windows.
Последняя известная версия TASM — 5.3, поддерживающая инструкции
MMX, на данный момент включена в Turbo C++ Explorer. Но официально
развитие программы полностью остановлено.
8
Microsoft поддерживает свой продукт под названием Microsoft Macro
Assembler. Она продолжает развиваться и по сей день, последние версии
включены в наборы DDK. Но версия программы, направленная на создание
программ для DOS, не развивается. Кроме того, Стивен Хатчессон создал
пакет для программирования на MASM под названием «MASM32».
9
3 Разработка алгоритма программы
Основная часть программы начинается с инициализации сегманта
данных и стека. Состоит она из последовательного вызова процедур.
Сначала вызываем процедуру, которая открывает файл UK64.dat.
Затем, процедуру поиска кадра в дампе памяти файла UK64.dat в
соответствии со своим вариантом. Считываем найденный нами кадр в
переменную. Закрываем файл UK64.dat.
Вызываем процедуру создания файла my.dat. Затем процедуру
записи найденного кадра, хранящегося в переменной, в файл my.dat.
Закрываем файл my.dat.
После
этого, создаем файл result.dat. Вызываем процедуру,
осуществляющую выборку заданных бит в байтах согласно варианту.
Записываем данные в канальный файл result.dat. Закрываем файл result.dat
На этом программа по преобразованию информации, заданной в виде
дампа памяти, в канальный файл с использованием системы команд МП i486.
заканчивается, задача выполнена.
Полученный файл result.dat передаем в программу построения
графика. Получаем искомый график канального файла.
3.1 Поэтапный алгоритм программы
Программа состоит из 14 выполняющихся друг за другом этапов.
Первый этап – Начало программы. Второй этап – Открытие файла UK64.dat.
Третий – Поиск заданного кадра. Четвёртый – Процедура поиск нулевой
строки. Пятый – Создание файла My.dat. Шестой – создание Result.dat.
Седьмой – Запись найденного кадра в файл My.dat. Восьмой – Чтение
найденного кадра в переменную. Девятый – Запись в канальный файл
Result.dat. Десятый – Выборка бит в заданных байтах. Одиннадцатый –
Закрытие файла My.dat. Двенадцатый - Закрытие файла Result.dat.
Тринадцатый - Закрытие файла UK64.dat. Четырнадцатый - Завершение
программы.
10
Рисунок 4 – Блок-схема программы
11
Рисунок 5 – Блок-схема процедуры «начало программы»
Рисунок 6 – Блок-схема процедуры «открытие файла uk64.dat»
12
Рисунок 7 – Блок-схема процедур « Заданного кадра» и «Чтение найденного
кадра», « Закрытие файла UK64.dat»
13
Рисунок 8 – Блок-схема процедуры « Поиск нулевой строки»
14
Рисунок 9 – Блок-схема процедуры « Закрытие файла UK64.dat»
Рисунок 10 – Блок-схема процедур «Создание файла My.dat», « Запись
найденного кадра в файл My.dat», «Закрытие файла My.dat»
15
Рисунок 11 – Блок-схема процедур «Создание файла Result.dat», « Выборка
бит в заданных байтах», «Запись в кнальный файл Result.dat»
16
Рисунок 12 – Блок-схема процедуры «завершение программы»
3.2 Построение графика
Программа построения графика написана на языке C# в Windows
Forms. Программа считывает из файла RESULT.DAT по 1 байту, откладывая
на оси y его значения. В ось x входит интервал значений от 1 до 160
(RESULT.DAT состоит из 160 байт).
17
4 Разработка программы
Данный курсовой проект включает в себя разработку программы,
которая преобразовывает информация, заданную в дампе памяти, в
канальный файл с использованием системы команд МП i486. В качестве
исходных данных необходимо использовать данные дампа памяти сведенные
в файле UK64.dat. Каждый дамп отделяется от предыдущего строкой,
состоящей из 16-ти нулевых байт. В соответствии с индивидуальным
заданием на курсовой проект использовать для каждого варианта
соответствующие байты и, выделяемые из них, биты.
После того как будет найден нужный дамп памяти, он записывается в
файл my.dat. Из файла my.dat формируются слова, которые сохраняются в
файл result.dat. В итоге должен получиться канальный файл result.dat с
формированными в нем словами, а также графическое представление этого
файла.
4.1 Описание команд микропроцессора
4.1.1 Команды пересылки и загрузки
MOV (MOVe operand)
Команда mov применяется для различного рода пересылок данных,
при этом, несмотря на всю простоту этого действия, необходимо помнить о
некоторых ограничениях и особенностях выполнения данной операции:
направление пересылки в команде mov всегда справа налево, то есть из
второго операнда в первый;
значение второго операнда не изменяется;
оба операнда не могут быть из памяти (при необходимости можно
использовать цепочечную команду movs); лишь один из операндов может
быть сегментным регистром; желательно использовать в качестве одного из
операндов регистр AL/AX/EAX, так как в этом случае TASM генерирует
более быструю форму команды mov.
LEA (Load Effective Address)
Данная команда является альтернативой оператору ассемблера offset.
В отличие от offset команда lea допускает индексацию операнда, что
позволяет более гибко организовать адресацию операндов.
18
POP (POP operand from the stack)
Команда применяется для восстановления содержимого вершины
стека в регистр, ячейку памяти или сегментный регистр. Заметим, что
недопустимо восстановление значения в сегментный регистр CS.
PUSH (PUSH operand onto stack)
Команда push используется совместно с командой pop для записи
значений в стек и извлечения их из стека. Размер записываемых значений —
слово или двойное слово. Также в стек можно записывать непосредственные
значения. Заметьте, что в отличие от команды pop в стек можно включать
значение сегментного регистра CS. Другой интересный момент связан с
регистром SP. Команда push ESP/SP записывает в стек значение ESP/SP по
состоянию до выдачи этой команды. В микропроцессоре i8086 по этой
команде записывалось скорректированное значение SP. При записи в стек 8битных значений для них все равно выделяется слово или двойное слово (в
зависимости от use16 или use32).
4.1.2 Арифметические команды
В программе используются некоторые арифметические команды,
с помощью которых проводятся вычисления. К арифметическим командам
относят следующие:
- add приемник, источник
- sub приемник, источник
- mul источник
- div источник
- inc приемник
- dec приёмник
- neg приемник
Рассмотрим подробнее те которые используются в программе
ADD (ADDition)
Команда add используется для сложения двух целочисленных
операндов. Результат сложения помещается по адресу первого операнда.
Если результат сложения выходит за границы операнда приемник (возникает
переполнение), то учесть эту ситуацию следует путем анализа флага CF и
последующего возможного применения команды adc.
19
SUB (SUBtract)
Команда sub используется для выполнения вычитания целочисленных
операндов или для вычитания младших частей значений многобайтных
операндов.
DEC (DECrement operand by 1)
Команда dec используется для уменьшения значения байта, слова,
двойного слова в памяти или регистре на единицу. При этом команда не
воздействует на флаг CF.
INC
Назначение: увеличение значения операнда в памяти или регистре на
единицу.
4.1.3 Циклический сдвиг
RCL (Rotate operand through Carry flag Left)
Команда rcl используется для циклического сдвига разрядов операнда
влево. Особенность этого сдвига в том, что он происходит с некоторой
задержкой, так как очередной сдвигаемый бит оказывается на некоторое
время вне операнда. В это время можно произвести его извлечение и (или)
подмену. Другой важный момент заключается в том, что для счетчика сдвига
микропроцессор использует только пять младших разрядов операнда
количество_разрядов.
Таким
образом,
значение,
большее
31,
микропроцессором не допускается (аппаратно это ограничение реализуется
тем, что игнорируются значения всех битов счетчика, кроме первых пяти).
4.1.4 Циклы
LOOP (LOOP control by register cx)
Команду loop применяют для организации цикла со счетчиком.
Количество повторений цикла задается значением в регистре ECX/CX перед
входом в последовательность команд, составляющих тело цикла. Помните о
двух важных моментах: для предотвращения выполнения цикла при нулевом
ECX/CX используйте команду jecxz/jcxz. Если этого не сделать, то при
изначально нулевом ECX/CX цикл повторится 4 294 967 295/65 536 раз;
смещение метки, являющейся операндом loop, не должно выходить из
диапазона -128...+127 байт. Это смещение, как и в командах условного
20
перехода, является относительным от значения счетчика адреса следующей
за loop команды.
4.1.5 Синтаксис процедуры
На языке ассемблера процедура оформляется следующим образом:
метка proc тип_адресации
;тело процедуры
метка endp
CALL
Команда call позволяет организовать гибкую и многовариантную
передачу управления на подпрограмму с сохранением адреса точки возврата.
RET (RETurn)
Команду ret необходимо применять для возврата управления
вызывающей программе из процедуры, управление которой было передано
по команде call. На самом деле микропроцессор имеет три варианта команды
возврата ret - это ret, ее синоним retn, а также команда retf. Они отличаются
типами процедур, в которых используются. Команды ret и retn служат для
возврата из процедур ближнего типа. Команда retf — команда возврата для
процедур дальнего типа. Какая конкретно команда будет использоваться,
определяется компилятором; программисту лучше использовать команду ret
и доверить транслятору самому сгенерировать ее ближний или дальний
вариант. Количество команд ret в процедуре должно соответствовать
количеству точек выхода из нее.
4.1.6 Операции над битами и байтами
BT (Bit Test)
Тестирование бита с номером из CX в AX и перенос его во флаг CF.
4.1.7 Команда сравнения и условного перехода
CMP (CoMPare operands)
Данная команда используется для сравнения двух операндов методом
вычитания, при этом операнды не изменяются. По результатам выполнения
команды устанавливаются флаги. Команда cmp применяется с командами
условного перехода и командой установки байта по значению setcc.
21
JNZ (Jump if not zero)
Команда условного перехода на метку. Осуществляет переход, если
флаг ZF не равен нулю.
4.1.8 Префиксы
CMPSB (CoMPare String Byte/Word/Double word operands)
Команда без префикса осуществляет простое сравнение двух
элементов в памяти. Транслятор, обработав команду cmps и выяснив тип
операндов, генерирует одну из машинных команд cmpsb, cmpsw или cmpsd.
Машинного аналога для команды cmps нет. Для адресации назначения
обязательно должен использоваться регистр ES, а для адресации источника
можно делать замену сегмента с использованием соответствующего
префикса. Для того чтобы эти команды можно было использовать для
сравнения последовательности элементов, имеющих размерность байт,
слово, двойное слово, необходимо использовать один из префиксов repe или
repne. Префикс repe заставляет циклически выполняться команды сравнения
до тех пор, пока содержимое регистра ECX/CX не станет равным нулю или
пока не совпадут очередные сравниваемые элементы цепочек (флаг zf=1).
REPE (REPeat string operation)
Команда repe в силу специфики своей работы называется префиксом.
Она имеет смысл только при использовании цепочечных операций, заставляя
их циклически выполняться и тем самым без организации внешнего цикла
обрабатывать последовательности элементов фиксированной длины.
Большинство применяемых префиксов являются условными, то есть они
прекращают работу цепочечной команды при выполнении определенных
условий.
22
4.2 Регистры общего назначения
Регистрами общего назначения называются 32-битные регистры EAX,
EBX, ECX, EDX, EBP, ESP, ESI и EDI. Данные регистры используются для
хранения операндов логических и арифметических команд. Кроме того, они
могут использоваться для хранения операндов при вычислении адресов
(кроме регистра ESP, который не может быть использован как индексный
операнд). Имена указанных регистров наследованы от имен регистров
общего назначения процессора 8086 - AX, BX, CX, DX, BP, SP, SI и DI. Эти
16-ти разрядные, в свою очередь имеют адресуемые младшие и старшие одно
байтовые половинки. Каждый байт 16-битных регистров AX, BX, CX и DX
также имеет свое имя. Байты этих регистров называются AH, BH, CH и DH
(старшие байты) и AL, BL, CL и DL (младшие байты).
Рисунок 13 - Регистры общего назначения
Регистры EAX и AX являются аккумуляторами и применяются для
всех основных операций ввода-вывода, некоторых операций над строками и
некоторых арифметических операций. Например, команды умножения,
деления и сдвига предполагают использование регистров EAX и AX.
Некоторые команды генерируют более эффективный код, если они имеют
ссылки на регистры EAX и AX.
23
Рисунок 14 - Регистры EAX и AX
Регистры EBX и BX являются базовыми регистрами. Эти регистры
общего назначения могут использоваться в качестве "индекса" для
расширенной адресации. Другое общее их применение - вычисления.
Рисунок 15 - Регистры EBX и BX
Регистры ECX и CX являются счетчиками. Они необходимы для
управления числом повторений циклов и для операций сдвига влево или
вправо. Эти регистры используется также для вычислений.
Рисунок 16 - Регистры ECX и CX
Регистры EDX и DX являются регистрами данных. Они применяется
для некоторых операций ввода-вывода и тех операций умножения и деления
над большими числами, которые используют регистровые пары EDX:EAX
или DX:AX.
Рисунок 17 - Регистры EDX и DX.
24
4.2.1 Индексные регистры
Индексный регистр — регистр процессора, используемый для
автоматического изменения адреса операнда во время исполнения
программы.
В архитектуре x86 индексные регистры называются SI и DI. При
базово-индексной адресации их содержимое может суммироваться с
содержимым регистра BX.
Индексный регистр-источник SI применяется в качестве указателя
адреса байта или слова в таких строковых командах, как LODS (загрузить
строку), CMPS (сравнить строку), MOVS (переслать строку).
Индексный регистр-приёмник DI используется как указатель
назначения для адреса байта или слова в строковых командах, таких как
SCAS (сканировать строку), CMPS, MOVS, STOS (записать строку)
4.2.2 Сегментные регистры
Сегментные регистры предназначены для хранения базовых адресов в
реальном режиме или селектора в защищенном режиме ,соответствующих
сегментов памяти.Все сегментные регистры 16 разрядные.
SS - содержит базовый адрес текущего сегмента стека.
CS - содержит базовый адрес текущего кодового сегмента.
DS - сегмент данных по умолчанию.
ES, FS, GS - дополнительные регистры, служат для дополнительной
адресации сегмента данных.
4.4 Описание используемых функций
В программе проводятся действия с различными файлами
(Uk64.dat, My.dat, Result.dat). Происходит их закрытие, создание, открытие,
запись, считывание из них.
Для работы с отдельным файлом необходимо указать в регистре
BX дескриптор этого файла.
Открытие файла. В Ah помещается № функции открытия файла, в
данном случае это 3DH. В Al - режим доступа, у нас 00 – для чтения. В Dx
помещается эффективный адрес строки. Вызываем 21-е прерывание. В
идентификатор используемого файла помещаем содержимое регистра АХ.
Создание файла. В Ah помещается № функции создания файла, в
данном случае это 3СH. Обнуляем регистр СХ. В Dx помещается
25
эффективный адрес строки. Вызываем 21-е прерывание. В переменную для
хранения дескриптора помещаем содержимое регистра АХ.
Чтение данных. В Ah помещается № функции, в Вх – дескриптор
файла. Сх – число байт для чтения. В Dx эффективный адрес переменной,
куда будут считываться байты.
Закрытие файла. В Вх помещается дескриптор файла. В Ah №
функции – 3EH. Вызывается 21-е прерывание.
4.5 Описание процедур программы
Ниже приведено описание используемых в программе процедур:
процедуры открытия файла “Uk64.dat”, процедуры чтения заданного
варианта, процедуры поиска нулевой строки, процедуры записи в файл
“My.dat” и процедуры создания и записи канального файла.
4.5.1 Начало
Выполняется инициализация сегментного регистра ds (132-133).
Настройка дополнительного сегмента данных (es в качестве адреса
цепочки-приёмника) для работы с цепочками данных (137-138).
4.5.2 Процедура открытия файла “Uk64.dat”
Вначале, регистр AH инициализируется номером функции для
открытия существующего файла (5), затем помещаем в AL режим доступа
(6). Обнуляем CX (маска атрибутов) (7), помещаем в DX исполнительный
адрес строки с именем файла (8), открываем файл “Uk64.dat” (9) и сохраняем
в переменной идентификатор файла “Uk64.dat” (10). На языке ассемблера
это выглядит следующим образом:
4.5.3 Процедура чтения заданного варианта
Помещаем в CX номер заданного варианта (14), затем уменьшаем его
значение на 1 (15). Вызываем процедуру поиска нулевой строки в кадре до
тех пор, пока значение CX не станет равным 0 (16). Помещаем в AH номер
функции чтения из файла (17), в BX – идентификатор (18), в CX количество
необходимых бит (41). Затем, помещаем в DX исполнительный адрес буфера
для приема данных (42). Производим чтение данных из файла “Uk64.dat”
(43), помещаем в AH номер функции для закрытия файла (44) и закрываем
его (49).
26
4.5.4 Процедура поиска нулевой строки
Помещаем в стек значение регистра CX (22), в BX – идентификатор
файла (23). Помещаем в стек значение регистра DS (24) и извлекаем значение
из стека в регистр ES (25). Помещаем в AH номер функции для чтения из
файла (28), в CX – количество необходимых байт (строка – 16 байт) (27).
Помещаем в DX исполнительный адрес буфера для приема данных (29).
Производим чтение строки байтов из файла “Uk64.dat” (30). Помещаем в SI
исполнительный адрес считанной строки (31), в DI – исполнительный адрес
объявленной нулевой строки (32). Сохраняем в CX количество сравниваемых
байтов (27, 33) и производим попарное сравнение байт по адресам из SI и DI
(34). Если ZF равно 0, то сравниваем значение регистра CX и 0 (35), иначе,
если ZF не равно 0, то продолжаем попарное сравнение байт по адресам из SI
и DI (34). Если CX не равно 0, то переходим на метку «more» (36) и
помещаем в AH номер функции для чтения из файла (28). Далее
восстанавливаем из стека значение регистра CX (37).
4.5.5 Процедура записи в файл “My.dat”
Помещаем в AH номер функции для создания файла (55), обнуляем
CX (атрибут файла) (56), помещаем в DS:DX смещение переменной с именем
файла (57), создаём файл “My.dat” (58). Сохраняем идентификатор файла
“My.dat” в переменной (59), помещаем в AH номер функции для записи в
файл (63). Сохраняем в BX идентификатор файла (64), помещаем в CX
количество необходимых байт (65). Помещаем в DX исполнительный адрес
буфера с данными (66), производим запись кадра в файл “My.dat” (67).
Помещаем в AH номер функции для закрытия файла “My.dat” (71), в BX –
идентификатор файла (72). Закрываем файл “My.dat” (73).
4.5.6 Процедура создания и записи канального файла
Помещаем в AH номер функции для создания файла (77), обнуляем
CX (атрибут файла) (78). Помещаем в DS:DX адрес строки с именем файла
(79), создаем файл “Result.dat” (80). Сохраняем идентификатор файла
“Result.dat” в переменной (81), помещаем в SI исполнительный адрес буфера,
содержащего кадр (99). Вычитаем из него 16 байт, т.к. первая строка
(нулевая) не считана (100). Помещаем в DI исполнительный адрес буфера для
хранения результатов (101). Устанавливаем счетчик CX, поместив в него
необходимое количество байт (102). Сохраняем в стеке значения внешнего
27
счетчика (104), инициализируем счетчик внутреннего цикла (105). Обнуляем
DX (106), сохраняем в стеке значение счетчика (108). Помещаем (2 раза) в
стек значение регистра SI (109,110). Производим суммирование SI и
смещения первого байта (111). Инициализируем AX байтом по адресу DS:SI
(112), помещаем в CX смещение первого бита (его номер) (113). Производим
считывание в флаг CF бита из AX со смещением, равным CX (114).
Осуществляем циклический сдвиг регистра DX влево через флаг CF на 1
(115), затем восстанавливаем значение SI из стека (116). Суммируем SI и
смещение второго байта (117), производим пересылку байта из DS:SI в AX
(118). Помещаем в CX смещение второго бита (его номер) (119), производим
считывание в флаг CF бита из AX со смещением, равным CX (120).
Осуществляем циклический сдвиг регистра DX влево через флаг CF на 1
(121), восстанавливаем значение SI из стека (122), затем увеличиваем его на
16 (переход на следующую строку) (123). Восстанавливаем счетчик
внутреннего цикла (124), если значение CX равно нулю, то помещаем
значение байта из DL по адресу DS:DI (126), иначе возвращаемся к метки
«look_string» и сохраняем в стеке значение счетчика (127). Делаем инкремент
адреса в DI (переход на следующий байт) (128), восстанавливаем значение
счетчика внешнего цикла (128). Если его значение равно 0, то помещаем в
AH номер функции для записи в файл (91), иначе осуществляем переход на
метку «make_byte» и сохраняем в стеке значение внешнего счетчика (104).
Помещаем в BX идентификатор файла (92), сохраняем в CX количество
записываемых байт (93). Помещаем в DS:DX адрес строки с названием файла
(94), осуществляем запись результата в файл “Result.dat” (95). Помещаем в
AH номер функции для закрытия файла (96) и закрываем его (97).
4.5.7 Завершение программы
Используется функция завершения программы 4ch. Завершается
работа программы (150-151).
4.6 Описание программы разработанной на языке C#
Первый шаг при построении графика в C# – это создание формы.
Выбираем следующие компоненты: Chart, Button, Label. Затем приступаем к
программному коду.
Строка 1-9 – подключение необходимых пространств имён, строка 21
– необходимое условие для построения графика. 18-39 интерфейсная часть, в
которой хранятся описания видимых объектов. Строка 23- введение
28
функции, позволяющей работать с данными представленными в необычном
для нас виде (биты, байты, наборы байтов, потоки данных). Открытие файла
Result.dat по пути, указанному вручную.
24-29 вызывается процедура
построения графика. В 36 вызывается процедура кнопки «Выход», которая
описана в строках 37-39. Строка 26 – цикл с предусловием: пока файл не
закончится, считывается байт и отображается на экране, номер байта
инкрементируется.
29
5 Результат выполнения программы
5.1 My.dat
Рисунок 18 – Содержимое канального файла my.dat
30
5.2 Result.dat
Рисунок 19 – Содержимое канального файла result.dat
5.3 Карта памяти
После компиляции и компоновки файла, содержащего исходный код
программы, получим одноименный файл с расширением *.map, который
содержит карту памяти. В свою очередь, карта памяти содержит
информацию о размещении сегментов программы (данных, текста
программы и стека) в оперативной памяти.
В первом столбце указан адрес начала сегмента, во втором – адрес его
конца, в третьем – размер, в следующем – имя, а в последнем – класс.
Рисунок 20 – Карта памяти
31
5.4 График
Рисунок 21 – Графическое представление канального файла result.dat
32
Заключение
Итогом курсового проекта стало повышение навыков по
программированию на языке Assembler и алгоритмизации, получение
необходимых знаний для работы в графическом режиме и построения
графиков.
Результатом выполнения курсового проекта является законченная
программа, реализующая преобразование информации заданной дампом
памяти в канальный файл.
33
Список используемых источников
1. Зубков С.В. «Assembler. Язык неограниченных возможностей», изд.
«ДМК Пресс», 1999
2. Немнюгин С.А. «Turbo Pascal. Программирование на языке
высокого уровня», СПб.: Питер, 2005 – 254с.
3. Юров В.И. «Справочная система по языку ассемблера IBM PC»,
изд. «Питер»,1998
4. Мурлин А.Г. Микропроцессорные системы. Методические
указания к курсовому проекту для студентов всех форм обучения
специальности 351400 – Прикладная информатика (по отраслям) / КубГТУ;
Краснодар, 2007. - 19 с.
5. Дрейдер М. C# для школьников: Учебное пособие / М. Дрейдер.
Перевод с англ. Под ред. В. Биллига-М.: Интернет-Университет
Информационных Технологий; БИНОМ. Лаборатория знаний, 2009. -128 с.:
ил., табл. (Лицей информационных технологий). ISBN 9785996302369
(БИНОМ.Л3)
34
Приложение 1 - Код основной программы
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
.486
assume CS:CodeSg, DS:DataSg, SS:StackSg
CodeSg segment 'CODE' use16
OpenUk proc
mov AH, 3Dh
mov AL, 00h
xor CX, CX
lea DX, UK
int 21h
mov descuk, AX
ret
OpenUk endp
Set proc
mov cx,variant
dec cx
ddd:
call find0
loop ddd
ret
Set endp
find0 proc
push cx
mov bx, descuk
push DS
pop ES
more:
mov cx,10h
mov ah,3fh
lea dx,cmpstr
int 21h
lea si,cmpstr
lea di,etstr
mov cx,10h
repe cmpsb
cmp cx,0
jnz more
pop cx
35
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
ret
find0 endp
Read proc
mov AH, 3Fh
mov BX, descuk
mov CX, 10240
lea DX, kadr
int 21h
ret
Read endp
CloseUk proc
mov AH, 3Eh
mov BX, descuk
int 21h
ret
CloseUk endp
CreatMy proc
mov AH, 3Ch
xor CX, CX
mov DX, offset my
int 21h
mov descmy, AX
ret
CreatMy endp
Rec proc
mov AH, 40h
mov BX, descmy
mov CX, 10240
lea DX, kadr
int 21h
ret
Rec endp
CloseMy proc
mov AH, 3Eh
mov BX, descmy
int 21h
ret
CloseMy endp
CreateResult proc
36
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
mov AH, 3Ch
xor CX, CX
mov DX, offset result
int 21h
mov descrsl, AX
ret
CreateResult endp
CloseResult proc
mov AH, 3Eh
mov BX, descrsl
int 21h
ret
CloseResult endp
Write proc
mov AH, 40h
mov BX, descrsl
mov CX, kol_b
mov DX, offset Res
int 21h
ret
Write endp
Vibor proc
lea SI, kadr
sub SI, 16
lea DI, Res
mov CX, kol_b
Make_byte:
push CX
mov CX, 4
xor DX, DX
Look_string:
push CX
push SI
push SI
add SI, Byte_1
mov AX, [SI]
mov CX, Bit_1
BT AX, CX
rcl DX, 1
37
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
pop SI
add SI, Byte_2
mov AX, [SI]
mov CX, Bit_2
BT AX, CX
rcl DX, 1
pop SI
add SI, 16
pop CX
loop Look_string
mov [DI], DL
inc DI
pop CX
loop Make_byte
ret
Vibor endp
begin:
mov AX, DataSg
mov DS, AX
mov AX, StackSg
mov SS, AX
push DS
pop ES
call OpenUk
call Set
call Read
call CloseUK
call CreatMy
call Rec
call CloseMy
call CreateResult
call Vibor
call Write
call CloseResult
mov AX, 4C00h
int 21h
CodeSg ends
DataSg segment 'DATA' use16
cmpstr
db 16 dup(?)
38
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
etstr db 16 dup (0)
variant dw 14
Byte_1
dw 23
Bit_1 dw 1
Byte_2
dw 25
Bit_2 dw 7
kol_b dw 160
Res db 160 dup (?)
uk db "UK64.dat",0
my db "MY.dat",0
result db "RESULT.dat",0
descuk dw ?
descmy dw ?
descrsl dw ?
kadr db 10256 dup(?)
DataSg ends
StackSg segment stack 'STACK' use16
db 256 dup(0)
StackSg ends
end begin
39
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Приложение 2 – Код программы построения графика
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() ==
System.Windows.Forms.DialogResult.OK )
{
BinaryReader BR = new
BinaryReader(File.Open(openFileDialog1.FileName, FileMode.Open));
int x = 0;
while ( BR.BaseStream.Position < BR.BaseStream.Length )
{
byte c = BR.ReadByte();
chartFile.Series[0].Points.AddXY(x,c);
x++;
}
BR.Close();
}
}
}
}
40
Скачать