README.md 4.87 KB
Newer Older
Andrey Zhdanov's avatar
Andrey Zhdanov committed
1
# Assignment 1: Input/Output library in assembly
Igor Zhirkov's avatar
Igor Zhirkov committed
2
---
Andrey Zhdanov's avatar
Andrey Zhdanov committed
3
Лабораторная работа 1: библиотека ввода-вывода на Assembler
Igor Zhirkov's avatar
Igor Zhirkov committed
4 5


Igor Zhirkov's avatar
Igor Zhirkov committed
6
Реализуйте библиотеку процедур, которые будут выполнять простые действия со строками, числами и их текстовыми представлениями.
Igor Zhirkov's avatar
Igor Zhirkov committed
7 8 9

# Подготовка

Igor Zhirkov's avatar
Igor Zhirkov committed
10
* Прочитайте первые две главы "Low-level programming: C, assembly and program execution".
Igor Zhirkov's avatar
Igor Zhirkov committed
11

Andrey Zhdanov's avatar
Andrey Zhdanov committed
12
* Ознакомьтесь с [документацией на следующие инструкции](https://gitlab.se.ifmo.ru/programming-languages/cse-programming-languages-fall-2024/main/-/blob/main/docs/intel-manual.pdf) и [Документацией по Linux ABI](https://gitlab.se.ifmo.ru/programming-languages/cse-programming-languages-fall-2024/main/-/blob/main/docs/x86_64-abi-0.99.pdf).
Igor Zhirkov's avatar
Igor Zhirkov committed
13 14 15 16 17 18 19 20 21 22

  - `xor`
  - `jmp`, `ja` и другими командами условного перехода
  - `cmp`
  - `mov`
  - `inc`, `dec`
  - `add`, `imul`, `mul`, `sub`, `idiv`, `div`
  - `neg`
  - `call`, `ret`
  - `push`, `pop`
Igor Zhirkov's avatar
Igor Zhirkov committed
23 24
  
  Документация — огромный документ. В просмотрщике PDF файлов найдите панель с оглавлением документа; там ищите второй том "Instruction Set Reference", где для каждой инструкции есть отдельная страничка.
Igor Zhirkov's avatar
Igor Zhirkov committed
25

Igor Zhirkov's avatar
Igor Zhirkov committed
26
![](./img/outline.png) 
Igor Zhirkov's avatar
Igor Zhirkov committed
27 28


Andrey Zhdanov's avatar
Andrey Zhdanov committed
29
* Прочитайте документацию на системный вызов `read` с помощью `man`. Его номер (который кладётся в `rax`) 0. Информацию о регистрах, используемых для передачи параметров в системные вызовы можно найти в [таблице](https://gitlab.se.ifmo.ru/programming-languages/cse-programming-languages-fall-2024/main/-/blob/main/docs/system-calls.md).
Igor Zhirkov's avatar
Igor Zhirkov committed
30 31 32

# Написание

Andrey Zhdanov's avatar
Andrey Zhdanov committed
33
- Впишите в `lib.asm` код вместо заглушек функций. По возможности переиспользуйте уже реализованные функции.
Igor Zhirkov's avatar
Igor Zhirkov committed
34 35
- Используйте `test.py` чтобы протестировать работу. 

Andrey Zhdanov's avatar
Andrey Zhdanov committed
36
Скрипт `test.py` будет генерировать набор исполняемых файлов с тестами для каждой функции, вы можете отладить их по-отделенности; также см. Appendix A в "Low-level programming: C, assembly and program execution". При выполнении тестов проверяется соответствие кода соглашениям о вызовах и выравнивание стека кратно 16 перед всеми вызовами `call`.
Igor Zhirkov's avatar
Igor Zhirkov committed
37 38 39 40
 
# Список распространённых ошибок

- Для строки размером `n` байт необходимы `n+1` байт из-за нуль-терминатора.
Igor Zhirkov's avatar
Igor Zhirkov committed
41 42 43 44 45
- Метки функций должны быть глобальными, остальные — локальными.
- Регистры не хранят ноль "по умолчанию".
- Если вы используете callee-saved регистры, вы должны сохранить их значения.
- Если вы используете caller-saved регистры, вы должны сохранить их значения перед `call` и затем восстанавливать.
- Не используйте буферы в секции `.data`. Вместо этого аллоцируйте место в стеке, уменьшая значение `rsp`.
Igor Zhirkov's avatar
Igor Zhirkov committed
46 47 48 49
- Функции принимают аргументы в `rdi`, `rsi`, `rdx`, `rcx`, `r8` и `r9`.
- Не выводите числа символ за символом. Сформируйте строку в памяти и вызовите `print_string`.
- Проверьте, что `parse_int` и `parse_uint` корректно устанавливают `rdx` (очень важно для следующего задания)
- Проверьте, что функции `parse_int`, `parse_uint` и `read_word` правильно работают когда ввод завершается с помощью `Ctrl-D`.
Andrey Zhdanov's avatar
Andrey Zhdanov committed
50
- При использовании стека надо не забывать уменшать `rsp`.
Andrey Zhdanov's avatar
Andrey Zhdanov committed
51 52
- Перед каждым вызовом `call` необходимо выравнивать стек кратно 16.
- Вызовы `syscall` могут изменить значения регистров `rax`, `rcx` и `r11`.
Andrey Zhdanov's avatar
Andrey Zhdanov committed
53
- Обратные кавычки позволяют использовать специальные символы в С-стиле (`\n`, `\t`).
Igor Zhirkov's avatar
Igor Zhirkov committed
54

Igor Zhirkov's avatar
Igor Zhirkov committed
55
Код решения занимает порядка 250 строк.