mirror of
https://github.com/maxbarsukov/itmo.git
synced 2026-09-12 19:19:57 +05:00
| .. | ||
| img | ||
| .editorconfig | ||
| .gdbinit | ||
| .gitignore | ||
| .gitlab-ci.yml | ||
| lib.inc | ||
| README.md | ||
| test.py | ||
| xmlrunner.py | ||
Assignment: Input/Output library in assembly
Лабораторная работа: библиотека ввода-вывода на Assembler
Реализуйте библиотеку процедур, которые будут выполнять простые действия со строками, числами и их текстовыми представлениями.
Подготовка
-
Прочитайте первые две главы "Low-level programming: C, assembly and program execution".
-
Ознакомьтесь с документацией на следующие инструкции.
xorjmp,jaи другими командами условного переходаcmpmovinc,decadd,imul,mul,sub,idiv,divnegcall,retpush,pop
Документация — огромный документ. В просмотрщике PDF файлов найдите панель с оглавлением документа; там ищите второй том "Instruction Set Reference", где для каждой инструкции есть отдельная страничка.
- Прочитайте документацию на системный вызов
readс помощьюman. Его номер (который кладётся вrax) 0.
Написание
- Впишите в
lib.incкод вместо заглушек функций. По возможности переиспользуйте уже реализованные функции. - Используйте
test.pyчтобы протестировать работу.
Скрипт test.py будет генерировать исполняемый файл с тестом для каждой функции, вы можете отладить его; также см. Appendix A в "Low-level programming: C, assembly and program execution".
Список распространённых ошибок
- Для строки размером
nбайт необходимыn+1байт из-за нуль-терминатора. - Метки функций должны быть глобальными, остальные — локальными.
- Регистры не хранят ноль "по умолчанию".
- Если вы используете callee-saved регистры, вы должны сохранить их значения.
- Если вы используете caller-saved регистры, вы должны сохранить их значения перед
callи затем восстанавливать. - Не используйте буферы в секции
.data. Вместо этого аллоцируйте место в стеке, уменьшая значениеrsp. - Функции принимают аргументы в
rdi,rsi,rdx,rcx,r8иr9. - Не выводите числа символ за символом. Сформируйте строку в памяти и вызовите
print_string. - Проверьте, что
parse_intиparse_uintкорректно устанавливаютrdx(очень важно для следующего задания) - Проверьте, что функции
parse_int,parse_uintиread_wordправильно работают когда ввод завершается с помощьюCtrl-D. - При использовании стека надо не забывать уменшать
rsp. - Обратные кавычки позволяют использовать специальные символы в С-стиле (
\n,\t).
Код решения занимает порядка 250 строк.
