CAOS-2024/25

Материал из Wiki - Факультет компьютерных наук
Перейти к: навигация, поиск

Вход в тестирующую систему: 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 это консольная утилитка для курса, выполняющая много вещей, среди которых можно выделить несколько основных:

  1. Скачивание задач/сэмплов/контрольных с помощью одной команды. То же самое со сдачей задач: можно сдать и получить сразу результат.
  2. Генерация тестов с помощью скриптов и их тестирование.
  3. Просмотр рейтинга (как общего, так и по группам) в удобном формате

Пример использования:

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.