|
| 1 | +# Assignment: Input/Output library in assembly |
| 2 | +--- |
| 3 | +Лабораторная работа: библиотека ввода-вывода на Assembler |
| 4 | + |
| 5 | + |
| 6 | +Реализуйте библиотеку процедур, которые будут выполнять простые действия со строками, числами и их текстовыми представлениями. |
| 7 | + |
| 8 | +# Подготовка |
| 9 | + |
| 10 | +* Прочитайте первые две главы "Low-level programming: C, assembly and program execution". |
| 11 | + |
| 12 | +* Ознакомьтесь с [документацией на следующие инструкции](https://gitlab.se.ifmo.ru/programming-languages/cse-programming-languages-fall-2021/main/-/blob/main/docs/intel-manual.pdf). |
| 13 | + |
| 14 | + - `xor` |
| 15 | + - `jmp`, `ja` и другими командами условного перехода |
| 16 | + - `cmp` |
| 17 | + - `mov` |
| 18 | + - `inc`, `dec` |
| 19 | + - `add`, `imul`, `mul`, `sub`, `idiv`, `div` |
| 20 | + - `neg` |
| 21 | + - `call`, `ret` |
| 22 | + - `push`, `pop` |
| 23 | + |
| 24 | + Документация — огромный документ. В просмотрщике PDF файлов найдите панель с оглавлением документа; там ищите второй том "Instruction Set Reference", где для каждой инструкции есть отдельная страничка. |
| 25 | + |
| 26 | + |
| 27 | + |
| 28 | + |
| 29 | +* Прочитайте документацию на системный вызов `read` с помощью `man`. Его номер (который кладётся в `rax`) 0. |
| 30 | + |
| 31 | +# Написание |
| 32 | + |
| 33 | +- Впишите в `lib.inc` код вместо заглушек функций. По возможности переиспользуйте уже реализованные функции. |
| 34 | +- Используйте `test.py` чтобы протестировать работу. |
| 35 | + |
| 36 | + |
| 37 | +Скрипт `test.py` будет генерировать исполняемый файл с тестом для каждой функции, вы можете отладить его; также см. Appendix A в "Low-level programming: C, assembly and program execution". |
| 38 | + |
| 39 | +# Список распространённых ошибок |
| 40 | + |
| 41 | +- Для строки размером `n` байт необходимы `n+1` байт из-за нуль-терминатора. |
| 42 | +- Метки функций должны быть глобальными, остальные — локальными. |
| 43 | +- Регистры не хранят ноль "по умолчанию". |
| 44 | +- Если вы используете callee-saved регистры, вы должны сохранить их значения. |
| 45 | +- Если вы используете caller-saved регистры, вы должны сохранить их значения перед `call` и затем восстанавливать. |
| 46 | +- Не используйте буферы в секции `.data`. Вместо этого аллоцируйте место в стеке, уменьшая значение `rsp`. |
| 47 | +- Функции принимают аргументы в `rdi`, `rsi`, `rdx`, `rcx`, `r8` и `r9`. |
| 48 | +- Не выводите числа символ за символом. Сформируйте строку в памяти и вызовите `print_string`. |
| 49 | +- Проверьте, что `parse_int` и `parse_uint` корректно устанавливают `rdx` (очень важно для следующего задания) |
| 50 | +- Проверьте, что функции `parse_int`, `parse_uint` и `read_word` правильно работают когда ввод завершается с помощью `Ctrl-D`. |
| 51 | +- При использовании стека надо не забывать уменшать `rsp`. |
| 52 | +- Обратные кавычки позволяют использовать специальные символы в С-стиле (`\n`, `\t`). |
| 53 | + |
| 54 | +Код решения занимает порядка 250 строк. |
| 55 | + |
0 commit comments