Файл: Разработка модуля для выполнения операций с натуральными числами в шестнадцатеричной системе счисления.pdf
Добавлен: 17.06.2023
Просмотров: 58
Скачиваний: 4
3. Реализация разработанного алгоритма
3.1. Выбор языка программирования
Исходя из задач модуля для выполнения операций с натуральными числами в шестнадцатеричной системе счисления, а так же из принципа его работы становится понятно, что программа, являющаяся разрабатываемым модулем должна быть предельно быстрой. Это вызвано тем, что такой модуль должен иметь возможность работать одновременно с несколькими программными оболочками, и своевременно обрабатывать запросы. Кроме того, модуль должен занимать как можно меньше места в памяти вычислительных систем, ведь это вспомогательная программа.
Из алгоритма программного модуля видно, что программа не является сложной, а значит, будет разумно реализовать её на языке программирования низкого уровня. Низкоуровневый язык программирования (язык программирования низкого уровня) — язык программирования, близкий к программированию непосредственно в машинных кодах используемого реального или виртуального процессора. Для обозначения машинных команд обычно применяется мнемоническое обозначение. Это позволяет запоминать команды не в виде последовательности двоичных нулей и единиц, а в виде осмысленных сокращений слов человеческого языка (обычно английских)[5].
Общеизвестный пример низкоуровневого языка — язык ассемблера, хотя правильнее говорить о группе языков ассемблера. Более того, для одного и того же процессора существует несколько видов языка ассемблера. Они совпадают в машинных командах, но различаются набором дополнительных функций (директив и макросов)[4].
Разрабатывая программный модуль для программных оболочек, работающих под управлением операционных систем семейства Windows, я выбрал язык ассемблера MASM.
Macro Assembler (MASM) — ассемблер для процессоров семейства x86. Первоначально был произведён компанией Microsoft для написания программ в операционной системе MS-DOS и был в течение некоторого времени самым популярным ассемблером, доступным для неё. Это поддерживало широкое разнообразие макросредств и структурированность программных идиом, включая конструкции высокого уровня для повторов, вызовов процедур и чередований[5].
Программы, написанные на языке ассемблера имеют небольшой размер и высокую скорость работы, что удовлетворяет требования, предъявляемым к программному модулю для выполнения операций с натуральными числами в шестнадцатеричной системе счисления. Единственным недостатком разработки программ на языках ассемблера является сложность написания программы, что не является существенным препятствием для написания простого программного модуля.
3.2. Методика и средства реализации алгоритма
на языке программирования.
Для реализации алгоритма на языке ассемблера MASM, в первую очередь, необходимо задать используемый набор операций. В тексте программы задан набор операций для процессора 80586 директивой ".586"[4].
Следующим шагом необходимо определить модель памяти программного модуля. Под ОС Windows 32/64 есть только одна — плоская модель. Кроме того, директива ".model" задаёт порядок передачи параметров функциям, а так же, кто уравнивает стек, после того, как функция была вызвана. Целиком директива будет иметь вид ".model flat, stdcall"[4].
Для работы со стандартными потоками ввода/вывода будут использоваться такие функции, как "crt_scanf" и "crt_printf". Для обеспечения доступа к этим функциям в коде программы следует подключить библиотеку и заголовочный файл. Заголовочный файл для этих функций называется "msvcrt.inc" и подключается директивой "include". Соответственно, библиотека называется "msvcrt.lib" и подключается директивой "includelib". При подключении любых файлов необходимо так же указать и путь по них[5].
Функция "crt_scanf", в качестве параметров, получает форматную строку и неограниченное число переменных. Форматная строка находится в сегменте данных и имеет вид "%x%c%x", что значит — шестнадцатеричное число, символ, шестнадцатеричное число. В качестве переменных используются два двойных слова под шестнадцатеричные числа и один байт под символ.
В коде программы функции будут вызываться директивой "invoke". Данная директива является упрощённым средством вызова функций на языке макро ассемблера. Суть её заключается в том, что компилятор сам добавит необходимое количество записей параметров в стек (вместо нескольких команд "push"), и вызовет функцию вместо команды "call"[5].
После вызова функции и поступления запроса в поток стандартного ввода все переменные будут иметь свои значения. На этом этапе следует распознать, какая именно арифметическая операция была задана. Из разработанного протокола видно, что операция задаётся символом — "+", "-", "/" или "*". Каждый из этих символов имеет код, и что бы узнать заданную операцию, достаточно сравнить код символа в переменной с заранее определёнными константами.
Сравнение проводится с помощью команды "cmp". Данная команда присваивает флагу нуля в регистре флагов значение "1", если разность сравниваемых чисел будет равна нулю (при этом сама разность никуда не записывается). Команда условного перехода "je" осуществляет передачу управления идущей за ней метке, если флаг нуля равен единице[4]. Таким образом, сравниваем значение символьной переменной с каждым значением символа операции и осуществляем затем условный переход на метку осуществления данной операции. Если ни одна из констант не сравнялась со значением символьной переменной, то налицо нарушение протокола обмена данными и программа будет завершена командой "ret", дабы освободиться для работы под управлением других оболочек.
Команда "add" осуществляет сложение двух операндов. Результат сложения помещается в первый операнд (приёмник). Например, при выполнении команды "add eax, num2" к содержимому регистра EAX прибавляется содержимое переменной num2. После выполнения команды результат будет находиться в регистре EAX. Первый операнд может быть регистром или переменной. Второй операнд (источник) — регистром, переменной или числом[4]. Невозможно, однако, осуществлять операцию сложения одновременно над двумя переменными, поэтому значение переменной num1 должно быть перенесено в регистр EAX заранее.
Команда "sub" вычитает из левого операнда правый. Левый операнд может быть регистром или переменной, а правый — регистром, переменной или числовой константой.
Единственным операндом команды "mul" может быть регистр или переменная. Здесь важен размер операнда (источника). Если операнд будет иметь длину в четыре байта, то он будет умножаться на значение регистра EAX, а результат будет помещён в пару регистров EDX:EAX[4].
Деление натуральных чисел осуществляется с помощью команды "div". Команда имеет всего один операнд — это делитель. Делитель может быть регистром или переменной. В зависимости от размера делителя выбирается и делимое. Если делитель имеет размер в четыре байта, делимое будет находиться в паре регистров EDX:EAX. После выполнения операции частное от деления окажется в регистре EAX, а остаток от деления — в EDX[4].
Очевидно, что при выполнении любой операции необходимо поместить в регистр EAX значение переменной num1, а значит, это следует сделать ещё до определения операции.
Форматная строка для вывода данных с помощью функции "crt_printf" находится так же в сегменте данных модуля и имеет вид "%x", то есть одно шестнадцатеричное число[5]. Результат передаётся в стандартный поток вывода с помощью вызова функции "crt_printf", после чего программа будет завершена с помощью команды "ret".
Программный код модуля для выполнения операций с натуральными числами в шестнадцатеричной системе счисления представлен в приложении 2.
3.3. Компиляция, испытание и анализ разработанного программного модуля
Что бы из кода получить саму программу, его необходимо скомпилировать. Для компиляции модуля для выполнения операций с натуральными числами в шестнадцатеричной системе счисления необходимы программы "ml.exe" и "link.exe" из пакета MASM32[4]. Команды для компиляции модуля из файла с кодом "hexprocessor.asm":
ml /c /coff hexprocessor.asm
link /subsystem:windows hexprocessor.obj
Готовая программа "hexprocessor.exe" занимает 2,5 Кб в памяти компьютера, а по факту 4 Кб в операционных системах семейства Windows, имеющих файловую систему NTFS. В любом случае, это значение меньше требуемого минимума и по данной характеристики никаких нареканий нет.
Программа требует 316 Кб оперативной памяти при запуске, что так же говорит об экономичности и нетребовательности модуля к вычислительным ресурсам.
Что касается скорости выполнения программы, то до одной тысячи запросов в секунду модуль не проявляет никаких задержек, что более чем достаточно для работы программного модуля под управлением одной или даже нескольких программных оболочек.
Заключение
В ходе написания данной работы мною была обоснована актуальность разработки модуля для выполнения операций с натуральными числами в шестнадцатеричной системе счисления. Заключается она, во-первых, в важности шестнадцатеричных вычислений в информационных технологиях, а во-вторых, в преимуществах модульного программирования.
На основании задач, решаемых модулем для выполнения операций с натуральными числами в шестнадцатеричной системе счисления был разработан алгоритм программы.
В качестве языка программирования для реализации модуля был выбран язык ассемблера, как язык уровня процессора. Ведь вычисления на низком уровне производятся в двоичной системе счисления, а из первой главы ясно, что между двоичной и шестнадцатеричной системами практически нет разницы.
В работе проведён детальный разбор средств языка ассемблера MASM32, позволяющих реализовать разработанный алгоритм. Текст готовой программы (как и алгоритм), приведены в приложениях.
Программа была скомпилирована и протестирована. Предметом дальнейших исследований может являться как расширение функциональной составляющей модуля, так и изучение более продвинутых технологий модульного программирования.
Список использованных источников
- Гашков С. Б. Системы счисления и их применение. — М.: МЦНМО, 2004, — 52 с.
- Таненбаум Э. Архитектура компьютера. 5-е изд. — СПб.: Питер, 2007, — 844 с.
- Дуванов А. А., Рудь А. В., Семенко В. П. Азы программирования. Факультативный курс. Книга для учителя. — СПб.: БХВ-Петербург, 2005. — 496 с.
- Пирогов В. Ю. Ассемблер на примерах. — СПб.: БХВ-Петербург, 2012. — 416 с.
- Пирогов В. Ю. Ассемблер для Windows. Изд. 4-е перераб. и доп. — СПб.: БХВ-Петербург, 2012. — 896 с.
Приложения
Приложение 1. Алгоритм программного модуля для выполнения операций
с натуральными числами в шестнадцатеричной системе счисления