README.md 3.53 KB
Newer Older
Igor Zhirkov's avatar
Igor Zhirkov committed
1 2 3 4 5
# assignment-1-io-library

Assignment #1: Input/Output library in assembly
---
Лабораторная работа №1 : библиотека ввода-вывода на Assembler
Igor Zhirkov's avatar
Igor Zhirkov committed
6 7 8 9 10 11


В этом задании вы реализуете библиотеку процедур, которые будут выполнять простые действия со строками, числами и их текстовыми представлениями.

# Подготовка

Igor Zhirkov's avatar
Igor Zhirkov committed
12
* Прочитайте первые две главы "Low-level programming: C, assembly and program execution".
Igor Zhirkov's avatar
Igor Zhirkov committed
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51

* Ознакомьтесь с [документацией на следующие инструкции](http://77.234.220.100:4813/low-level-programming/classes/-/blob/master/docs/intel-manual.pdf).

  - `xor`
  - `jmp`, `ja` и другими командами условного перехода
  - `cmp`
  - `mov`
  - `inc`, `dec`
  - `add`, `imul`, `mul`, `sub`, `idiv`, `div`
  - `neg`
  - `call`, `ret`
  - `push`, `pop`


* Прочитайте документацию на системный вызов `read` с помощью `man`. Его номер (который кладётся в `rax`) 0.

# Написание

- Впишите в `lib.inc` код вместо заглушек функций. По возможности переиспользуйте уже реализованные функции.
- Используйте `test.py` чтобы протестировать работу. 


В [материалах к первой практике](http://77.234.220.100:4813//low-level-programming/classes/-/tree/master/practice-1) есть базовая инструкция по использованию `gdb`, благодаря которой вы можете исполнять программу по шагам; `test.py` будет генерировать исполняемый файл с тестом для каждой функции, и вы можете отладить его; также см. Appendix A в [^1].
 
# Список распространённых ошибок

- Для строки размером `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`.

Код решения занимает порядка 250 строк