Разработать программу, определяющую корень уравнения x^3−0.5x^2+0.2x − 4 = 0 методом половинного деления с точностью от 0,001 до 0,00000001 в диапазоне [1;3].Если диапазон некорректен, то подобрать корректный диапазон.
Программа на C изначально разрабатывалась с учетом всех требований включительно до оценки 9. Поэтому, с самого начала, присутствует разделение на модули, работа с файлами, генерация случайных данных и подсчет времени работы программы.
После работы, в консоль выводится затраченное время в миллисекундах (без учета ввода и вывода).
Ограничение на точность: 0 < e (epsilon)
.
При вводе значений, программа подразумевает, что на вход подается корректное число типа double.
TODO
Аргумент | Описание | Пример |
---|---|---|
./a.out <epsilon> |
./a.out 0.001 |
|
<epsilon> -file <входной файл> [выходной файл] |
Передача и получение данных из программы с использованием файлов. Выходной файл может быть опущен, в таком случае результат выполнения будет выведен в консоль | ./a.out 0.3 -file input.txt , ./a.out 0.1 -file input.txt output.txt |
-random <seed> |
Запуск программы в режиме генерацией случайных данных. Сгенерированная строка и результат выполнения выводятся в консоль | ./a.out -random 10 |
-test <seed> |
Стресс-тестирование программы. | ./a.out -test 235 |
| /c-source - исходный код программы на языке C
| /tests
| | /temp - папка с временными файлами генерируемыми тестовой утилитой. которые подаются на вход программе
| | main.py - утилита тестирования
| /version-1 - ASM c исполняемым файлом полученный из c-source
| /version-2 - ASM с комментариями и исполняемым файлом (на базе version-0)
Для тестирования был написан специальный Python скрипт, который генерирует многочисленные наборы случайных данных вида (input, correct_answer)
на которых тестируется каждая программа. В рамках одного тестового прогона, наборы подаваемые на вход каждой программы одинаковы.
Тестирование файлового и консольного режима также происходит на одинаковых данных.
Для стресс-теста, каждая программа запускается скриптом несколько раз в режиме -test
, при этом время выполнения суммируется.
Ознакомиться подробнее с алгоритмом можно в main.py
- Исходный код программы на языке C (c-source)
- ASM код исходника на языке С (version-1)
- АSM код с комментариями и другими ручными преобразованиями (version-2)
Для получения ASM кода использовался следующий набор опций
gcc -masm=intel \
-fno-asynchronous-unwind-tables \
-fno-jump-tables \
-fno-stack-protector \
-fno-exceptions \
../c-source/*.c \
-S
Макросов в полученных ASM файлах не оказалось, но мною была удалена бОльшая часть служебных меток GCC.
Для получения исполняемого файла из ASM
gcc *.s
python3 tests/main.py c-source/a.out version-1/a.out
Running 300 tests of random on each executable...
✓ c-source/a.out: Random Tests Passed
✓ version-1/a.out: Random Tests Passed
Running 300 tests on each executable...
✓ c-source/a.out: Console Tests passed
✓ version-1/a.out: Console Tests passed
✓ c-source/a.out: File Tests passed
✓ version-1/a.out: File Tests passed
- АSM код с комментариями (version-2) Были добавлены требуемые комментарии
- Приведено решение задачи на C на планируемую оценку. Ввод данных осуществляется с клавиатры. Вывод данных осуществляется на дисплей.
- В полученную ассемблерную программу, откомпилированную без оптимизирующих и отладочных опций, добавлены комментарии, поясняющие эквивалентное представление переменных в программе на C. То есть, для всех ссылок на память, включая и относительные адреса и регистры, указать имя переменной на языке C исходной программы.
- Из ассемблерной программы убраны лишние макросы за счет использования при компиляции из C соответствующих аргументов командной строки и/или за счет ручного редактирования исходного текста ассемблерной программы.
- Модифицированная ассемблерная программа отдельно откомпилирована и скомпонована без использования опций отладки.
- Представлено полное тестовое покрытие, дающее одинаковый результат на обоих программах. Приведены результаты тестовых прогонов для обоих программ, демонстрирующие эквивалентность функционирования.
- Для сопоставления с полученной ассемблерной программой необходимо также приложить исходные тексты на ассемблере, сформированные компилятором языка C.
- Сформирован отчет с результатами тестовых прогонов и описанием используемых опций компиляции, проведенных модификаций ассемблерной программы.
- В программе на языке C необходимо использовать функции с передачей данных через формальные параметры.
- Внутри функций необходимо использовать локальные переменные, которые при компиляции отображаются на стек.
- В ассемблерную программу в местах вызова функции добавить комментарии, описывающие передачу фактических параметров и перенос возвращаемого результата. При этом небходимо отметить, какая переменная или результат какого выражения соответствует тому или иному фактическому параметру.
- В ассемблерных функциях для каждого формального параметра необходимо добавить комментарии, описывающие связь между именами формальных параметров на языке C и регистрами (или значением на стеке), через которые эти параметры передаются.
- Для сопоставления с полученной ассемблерной программой необходимо также приложить исходные тексты на ассемблере, сформированные компилятором языка C.
- Информацию о проведенных изменениях отобразить в отчете наряду с информацией, необходимой на предыдущую оценку.