Add test for 'read_word_length'
Nikita Akatyev authored
There is a task to skip whitespaces in the beginning
of the input, but its completion is not tested.
87435ee3
Name Last commit Last update
README.md Update README.md
lib.inc fix newline char code
termcolor.pyc init
test.py Add test for 'read_word_length'

Assignment №1: Input/Output library in assembly


Лабораторная работа №1 : библиотека ввода-вывода на Assembler

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

Подготовка

  • Прочитайте первые две главы "Low-level programming: C, assembly and program execution".

  • Ознакомьтесь с документацией на следующие инструкции.

    • 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 чтобы протестировать работу.

В материалах к первой практике есть базовая инструкция по использованию gdb, благодаря которой вы можете исполнять программу по шагам; 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.

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