diff --git a/Computer Science/Архитектуры/ACC32.md b/Computer Science/Архитектуры/ACC32.md new file mode 100644 index 0000000..d76d000 --- /dev/null +++ b/Computer Science/Архитектуры/ACC32.md @@ -0,0 +1,49 @@ +- 32-битная аккумуляторная архитектура процессора +- Вся логика использует единственный регистр общего назначения - аккумулятор +## Регистры и флаги +- `Acc` - 32-битный главный регистр +- `V` - overflow flag - флаг переполнения для чисел со знаком +- `C` - carry flag - флаг переноса из старшего бита +- `PC` - program counter - счетчик команд, хранит адрес следующей инструкции +> [!info] В YAML-конфигах состояние аккумулятор выводится через `{Acc:dec}` и `{Acc:hex}`, флаги - через `{V}` и `{C}` +## Кодирование и размеры инструкций +Команды имеют переменную длину для оптимизации плотности кода +- 1 байт - код операции +- 4 байта (полный операнд) - 32-битный адрес +- 2 байта (относительный операнд) - 16-битное знаковое смещение относительно `PC` + +| Тип инструкции | Операнд | Полный размер | Примеры | +| :------------- | :---------------------- | :------------ | :----------------------------------------------------- | +| Без операнда | Нет | **1 байт** | `halt`, `not`, `clv`, `clc`, `load_acc` | +| Относительные | Смещение (2 байта) | **3 байта** | `load`, `store`, `add`, `sub`, `and` | +| Абсолютные | Адрес / Число (4 байта) | **5 байт** | `jmp`, ветвления, `load_imm`, `load_addr`, `store_ind` | +## Система команд +### 1. Операции над памятью +- `load_imm ` - прямая загрузка (5 байт) +- `load ` - относительная загрузка (3 байта) +- `store ` - отночительное сохранение (3 байта) +- `load_addr ` - абсолютная загрузка (5 байт) +- `store_addr ` - абсолютное сохранение (5 байт) +- `load_acc` - разыменование указателя из `Acc` (1 байт, загружает значение по адресу из аккумулятора `acc <- mem[acc]`) +- `store_ind` - косвенная запись по указателю (5 байт, `mem[mem[
]] <- acc`) +## Арифметика +- `add ` / `sub ` - сложение/вычитание (5 байт, `acc +- mem[
])`, устанавливают флаги) +- `mul ` - умножение (5 байт, `acc * mem`, устанавливает флаги) +- `div ` - целочисленное деление (5 байт, `acc / mem`) +- `rem ` - остаток от деления (5 байт, `acc % mem`) +- `clv` / `clc` - сброс флагов (1 байт) +### Побитовые операции +- `not` - побитовая инверсия (1 байт) +- `and ` / `or ` / `xor ` - логические И, ИЛИ, XOR (5 байт) +- `shiftl ` - логический сдвиг влево (5 байт) +- `shiftr ` - логический сдвиг вправо (5 байт) +### Управление вычислительным процессом +- `jmp `- безусловный переход (5 байт) +- `beqz ` - переход, если `Acc == 0` (5 байт) +- `bnez ` - переход, если `Acc != 0` ( 5 байт) +- `bgtz ` - переход, если `Acc > 0` (5 байт) +- `bgez ` - переход, если `Acc >= 0` (5 байт) +- `bltz ` - переход, если `Acc < 0` (5 байт) +- `bvs ` / `bvc ` - переход, если флаг переполнения 1/0 (5 байт) +- `bcs ` / `bcc ` - переход, если флаг переноса 1/0 (5 байт) +- `halt` - остановка процессора (1 байт) \ No newline at end of file diff --git a/Computer Science/Архитектуры/Вычислительные архитектуры.md b/Computer Science/Архитектуры/Вычислительные архитектуры.md index e69de29..9eeed9e 100644 --- a/Computer Science/Архитектуры/Вычислительные архитектуры.md +++ b/Computer Science/Архитектуры/Вычислительные архитектуры.md @@ -0,0 +1,4 @@ +## Инструментарий +- [[Платформа Wrench]] +## Архитектуры +- [[ACC32]] \ No newline at end of file diff --git a/Computer Science/Архитектуры/Платформа Wrench.md b/Computer Science/Архитектуры/Платформа Wrench.md new file mode 100644 index 0000000..7fd9f21 --- /dev/null +++ b/Computer Science/Архитектуры/Платформа Wrench.md @@ -0,0 +1,37 @@ +- Учебная платформа и симулятор для курса архитектуры компьтера +- Разработана для практического изучения 5 принципиально разных архитектурных парадигм в рамках единого инструментария +- [Сайт](https://wrench.edu.swampbuds.me) +- [Исходники](https://github.com/ryukzak/wrench) +## Файлы конфигов +Каждый тест программы описывается декларативным `.yaml` файлом +- `limit` - максимальное число инструкций (защита от зацикливаний) +- `memory_size` - размер адресного пространства (по умолчанию 8 Кб) +- `memory_mapped_io` - начальное состояние портов + - `0x80` - входной поток + - `0x84` - выходной поток +- `reports` - секция для вывода в логи +### slice +Определяет какую часть журнала симуляции выводить +- `slice: all` - состояние процессора на каждом шаге +- `slice: last` - только финальное состояние на момент завершения +### Доступные метрики +Указываются в секции `view` в `reports` +- `{sim:instruction-count}` - число выполненных инструкций +- `{layout:sections-size}` - декларированный размер секций `.text` и `.data` +- `{mem:*-ranges}` - дипазоны адресов памяти, к которым реально обращался процессор +- `{memory:table}` - полная карта памяти с процентом покрытия +### Блок проверки +- Блок `assert` в секции `reports` отвечает за автоматическую проверку результата работы программы +- `[Состояние до запуска] >>> [Ожидаемое состояние после остановки]` +- Например, `numio[0x80]: [72, 101, 10] >>> []` (до запуска лежали три байта, после работы должен стать пустым) +- Или, `symio[0x84]: "" >>> "HELLO"` +- Что можно проверять + - Потоки ввода-вывода (числовое представление `numio` или строковое представление `symio` в ASCII) Непечатные символы (ASCII код меньше 32) заменяются на знаки вопроса `?` + - Состояние памяти (`mem[0..31]: 05 48 45 ...`) + - Регистры и счетчики процессора +## Стандарт ввода-вывода MMIO +Во всех архитектурах чтение/запись внешних устройств настроены абсолютно одинаково +- Адрес `0x80` - входной поток - очередь FIFO. При чтении процессором выдает очередной элемент из тестового массива +- Адрес `0x84` - выходной поток. Принимает 32-битные слова. Запись любого числа отправляет его в выходной поток +## Порядок байтов и адресация +Адресация побайтовая, то есть один адрес - один байт. Например, в 32-битной архитектуре чтение по `0x80` захватывает сразу `0x80, 0x81, 0x82, 0x83`. Порядок - `Little Endian` \ No newline at end of file diff --git a/АиСД/Задачи/LeetCode/Valid Palindrome II.md b/АиСД/Задачи/LeetCode/Valid Palindrome II.md new file mode 100644 index 0000000..8d916f1 --- /dev/null +++ b/АиСД/Задачи/LeetCode/Valid Palindrome II.md @@ -0,0 +1,35 @@ +Leetcode #680 | Easy | [[Два указателя]] +## Идея +Продолжение [[Valid Palindrome]], только теперь можно удалить один символ. При первом несовпадении запускаем вспомогательную функцию, которая допроверяет либо с `l+1 до r`, либо с `l до r-1` +## [[Big-O]] +- Время ```O(N)``` +- Память ```O(1)``` +## Код +```Java +class Solution { + public boolean validPalindrome(String s) { + int l = 0; + int r = s.length()-1; + + while (l < r) { + if (s.charAt(l) != s.charAt(r)) { + return isPalindrome(s, l+1, r) || isPalindrome(s, l, r-1); + } + l++; + r--; + } + return true; + } + + boolean isPalindrome(String s, int l, int r) { + while (l < r) { + if (s.charAt(l) != s.charAt(r)) { + return false; + } + l++; + r--; + } + return true; + } +} +``` \ No newline at end of file diff --git a/АиСД/Список задач.md b/АиСД/Список задач.md index 209fb46..a1093a0 100644 --- a/АиСД/Список задач.md +++ b/АиСД/Список задач.md @@ -72,4 +72,5 @@ Maximal Rectangle [[Course Schedule II]] [[Best Time to Buy and Sell Stock]] [[Best Time to Buy and Sell Stock II]] -[[Implement Trie (Prefix Tree)]] \ No newline at end of file +[[Implement Trie (Prefix Tree)]] +[[Valid Palindrome II]] \ No newline at end of file diff --git a/Итмо/Предметы/АК.md b/Итмо/Предметы/АК.md index fd60e21..c4d3983 100644 --- a/Итмо/Предметы/АК.md +++ b/Итмо/Предметы/АК.md @@ -11,7 +11,7 @@ csa - computer system architecture ## Лекции Конспект лекций + мои заметки + вся база по CS лежит [[Computer Science]] ## Лаба 3 - +Гайды по архитектурам [[Вычислительные архитектуры|тут]], гайд по wrench - [[Платформа Wrench]] ## Материалы - [Репа](https://gitlab.se.ifmo.ru/computer-systems/csa-rolling) - [Журнал](https://docs.google.com/spreadsheets/d/1WvS1ad9J6jXNwSxTRnQs4yGgUBlwFzopUXUiYbGCZMw/edit?gid=580192402#gid=580192402)