CAOS-2024/25
Вход в тестирующую систему: TBD
Материалы лекций: https://caos.myltsev.ru/lectures/
Стиль оформления программ на Си
Чатик курса - https://t.me/+LAhlvwO1KV8wNjYy
Канал с объявлениями - https://t.me/hse_caos_2024_c
Форма для фидбека - TBD
Конспект лекций 2021 года от студентов
Содержание
Чатики и преподаватели по группам
Лектор — Александр Мыльцев @myltsev
Старший семинарист - Игорь Минеев @objatie_groba
Настройка рабочего окружения
kks
https://github.com/darkkeks/kks
kks это консольная утилитка для курса, выполняющая много вещей, среди которых можно выделить несколько основных:
- Скачивание задач/сэмплов/контрольных с помощью одной команды. То же самое со сдачей задач: можно сдать и получить сразу результат.
- Генерация тестов с помощью скриптов и их тестирование.
- Просмотр рейтинга (как общего, так и по группам) в удобном формате
Пример использования:
kks sync # скачивание задач # тут вы написали свой код kks test --sample # тестирование kks submit
Больше примеров можно посмотреть в репозитории
Библиотека ввода-вывода
Библиотека ввода-вывода для ассемблера x86: simpleio_x86_64.S
Все библиотечные функции не меняют значения регистров rsp, rbp, rbx, r12, r13, r14, r15.
call writei32 // напечатать на экране значение edi // как знаковое десятичное число call readi32 // ввести с клавиатуры число и сохранить в eax call readi64 // ввести с клавиатуры число и сохранить в rax call writei64 // вывести rdi call finish // завершить исполнение программы
Внутри виртуальной машины её можно скачать командой wget https://caos2024.myltsev.ru/simpleio_x86_64.S
Если получаете сообщение, что Wget не установлен на вашей системе (на Ubuntu Desktop по умолчанию нет), то установите его следующей командой: sudo apt install wget
Виртуальная машина (VirtualBox)
Рекомендуется скачать образ и установить его в эмулятор VirtualBox. Логин-пароль xubuntu/xubuntu, можно делать sudo.
Docker для пользователей MacOS (intel based)
Проверялось на MacOS BigSur и Monterey
Загрузить сам докер можно отсюда: тык
Команда для запуска: docker run -it --rm -v `pwd`:/caos -w /caos ubuntu
В терминале заходите в свою папку с акосом и запускаете эту команду. После нее вы начинаете работать с контейнером Ubuntu в папке /caos, где будет все содержимое вашей папки в основной ОС. Изменять содержимое внутри /caos можно и изнутри контейнера, и снаружи, изменения будут видны и там и там.
Внутри контейнера стоит установить gcc-multilib, без неё не заведётся: apt update && apt install -y gcc-multilib
Теперь вы можете писать код внутри своей любимой IDE (запущенной напрямую в вашей ОС, например VSCode), а компилить и запускать в докере через терминал.
Docker для пользователей MacOS на Apple Silicon
Добавьте в .bashrc или .zshrc:
export DOCKER_DEFAULT_PLATFORM=linux/amd64
После этого перезапустите Docker.
Вариант2:
- Скачиваем docker.
- Переходим в папку с задачами в терминале.
- Выполняем
docker run --platform linux/amd64 -it --rm -v `pwd`:/caos -w /caos ubuntu
- Делаем
apt update
- Делаем
apt -y install build-essential gcc-multilib
- Собираем задачки командой
gcc -m32 -g задача.S simpleio_i686.S
CLion
Для начала скачайте CLion с официального сайта и устанавите его.
Если у вас не linux: вар. 1 - docker
Скачайте и установите docker desktop. Добейтесь того, чтобы у вас заработал docker hello world (docker run --rm hello-world
).
Если у вас MacOs на арме сделайте то, что написано выше.
После этого нам потребуется специальный образ с необходимыми для курса библиотеками и программами. Создайте файл с именем Dockerfile и следующим содержанием:
FROM ubuntu:latest RUN apt update && apt install -y gcc-multilib gdb make cmake g++ WORKDIR /caos
В директории с этим запустите эту команду чтобы собрать образ: docker build -t caos .
и дождитесь пока она выполнится.
После этого откройте окно настроек, перейдите в пункт Build, Execution, Deployment -> Toolchains и добавьте новый Toolchain с типом Docker.
В поле Image укажите caos:latest
, а остальные поля должны определиться автоматически. Поместите этот Toolchain первым в списке сделав его default'ным.
Если у вас не linux: вар. 2 - wsl (Windows only)
Установите wsl 2, выберите дистрибутив Ubuntu.
Внутри wsl 2 поставьте необходимые пакеты (sudo apt install gcc-multilib make cmake g++ gdb
.
После этого откройте окно настроек, перейдите в пункт Build, Execution, Deployment -> Toolchains и добавьте новый Toolchain с типом WSL. Все поля должны определиться автоматически. Поместите этот Toolchain первым в списке сделав его default'ным.
Далее
Создайте проект (можете выбрать C Executable, но это не особо принципиально) Скачайте simpleio_i686.S и поместите в корень проекта.
В CMakeLists.txt
удалите всё и вставьте это:
cmake_minimum_required(VERSION 3.10) project(caos ASM) add_compile_options(-m32) add_link_options(-m32) file(GLOB_RECURSE sources_list LIST_DIRECTORIES true ./*) foreach(file ${sources_list}) IF(${file} MATCHES ".S$" AND NOT ${file} MATCHES "simpleio_i686.S") get_filename_component(X ${file} NAME) add_executable(${X} ${file} simpleio_i686.S) endif() endforeach()
Сделайте Reload Cmake project (Внизу выберите вкладку Cmake и нажмите слева на кнопку обновления с двумя стрелочками).
Этот конфиг написан таким образом, чтобы эффективно работать совместно с kks. На каждый .S файл (кроме библиотеке simpleio_i686.S) он создаст цель для сборки.
После того как у вас в проекте появляется новый файл (например после kks sync
) нужно делать Reload Cmake project.
Выберите справа сверху интересующий вас файл и запускайте.
Подсветка синтаксиса
Если она работает неправильно, откройте файл simpleio_i686.S
, нажмите на его вкладку в списке открытых файлов сверху правой кнопкой мыши и выберите "Associate file type". В списке выберите Assembly Language.
Дебагер
Дебагер работает из-коробки.
Чтобы узнать значения регистра напишите в поле снизу строку $eax и нажмите на кнопку "+".
Yabloko
Для того чтобы собрать Yabloko вам потребуется
- Компилятор, который умеет собирать elf-файлы под архитектуру x86. В мире линукса для такого традиционно собирают ещё одну копию
gcc
(и называютx86_64-elf-gcc
, чтобы не путаться), однакоclang
, в отличие отgcc
, в стандартной поставке уже имеет кросс-компилятор и кросс-линкер, так что можно (пока в теории) использовать его. - QEMU
Всё это вы можете получить локально, не зависимо от того, на какой вы ОС. Если вы по какой-то причине решили использовать учебный (или любой другой) сервер, то не забывайте добавлять к команде ssh опцию -X, которая пробрасывает X-сервер, а также по настроению опцию -C, которая сжимает передаваемые данные. Если у вас не линукс, то в таком случае вам потребуется ещё и скачать и установить X-сервер. Для MacOs. Для windows. Если вы пользуетесь Putty, то поставьте галочку в Connection -> SSH -> X11 -> Enable X11 forwarding.