Лабораторная работа №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 строк