Вариант 22. Разработать программу вычисления числа π с точностью не хуже 0,1% посредством дзета-функции Римана.
Так как в программе используется библиотека math.h
, компилировать программы на C и ассемблере необходимо с
флагом -lm
:
gcc code-on-c.c -lm
Пример работы программы на фотографиях ниже.
P.S. точность вычисления от 1 включительно до 9 невключительно.
Работа программы в случае отсутствия одного из названий файлов (то есть, проверка на корректность числа аргументов):
Проверка на корректное открытие файлов находится в файле code-on-c.c:
FILE *input = fopen(argv[1], "r");
FILE *out = fopen(argv[2], "w");
if ((input == NULL) || (out == NULL)) {
printf("Incorrect file!\n");
return 0;
}
При наличии ошибок выводятся сообщения. Более подробно - в файле с кодом на С.
-
Реализация программы на ассемблере в виде двух или более единиц компиляции (программу на языке C, реализующую новый функционал, разделять допускается, но не обязательно). Сформированная модульная ассемблерная программа должна быть модифицирована в соответствии с выше предъявляемыми требованиями. В нее также должны быть внесены соответствующие комментарии -
выполено
Файлы с разделённой программой на ассемблере находятся в файлах code-on-assembly-1.s и code-on-assembly-2.s. Все необходимые комментарии добавлены. Разделил программу на С на два файла (по методам) и скомпилировал каждый из них в ассемблерную программу, после чего получил два ассемблерных файла.
Все тестовые файлы находятся в папке tests
. Так как программа делалась на 7 баллов, я сразу сделал и файлы с тестами (
файлы вида test1-in.txt
), и файлы с результатами тестов на трёх программах (файлы вида test1-out-a.txt
)
Все исходные тексты на ассемблере приложены.
Отчёт вы читаете прямо сейчас :) Про тестовые файлы будет описано чуть ниже.
Рефакторинг программы на ассемблере выполнен. Результат - в файле code-on-assembly-refactored.s.
-
Сопоставление размеров программы на ассемблере, полученной после компиляции с языка C с модифицированной программой, использующей регистры. Сопоставление программ необходимо проводить на уровне объектных и бинарных файлов. Исходные тексты ассемблерных программ сравнивать вряд ли имеет смысл из-за наличия в модифицированной программе комментариев. (6) -
выполнено
Размеры соответствующих программ на ассемблере:
code-on-assembly.s (программа, скомпилированная с отладочными опциями): 5067 bytes, 264 lines
code-on-assembly-refactored.s
(программа после рефакторинга): 4951 bytes, 276 lines
Возможно, сравнение не совсем корректное, так как в обоих программах есть комментарии. Тем не менее, их примерно одинаковое количество, а в программе после рефакторинга строк больше, но размер меньше.
Смотрите файл с кодом на C.
Файлы с тестами - в папке tests
. Так как изначально разрабатывал программу на 7 баллов, все тесты хранятся в файлах,
поэтому скриншоты с наглядным доказательством того, что программы работают одинаково не получится. Поэтому приложу
скриншот, подтверждающий тестовый прогон на трёх программах.
Во всех файлах с кодом на ассемблере были добавлены необходимые комментарии.
Была применена следующая команда:
gcc -masm=intel -fno-asynchronous-unwind-tables -fno-jump-tables -fno-stack-protector -fno-exceptions -S code-on-c.c
Надеюсь, никакие требования на оценки 4/5/6, которые необходимо было проделать для получения оценки 7, не забыл. Были договоренности о том, что можно делать ИДЗ сразу на желаемую оценку. Поэтому постарался сделать не только на 7 баллов, но и какие-то основные требования на другие оценки, которые по крайней мере не пересекаются с требованиями на более высокие оценки.