{"id":22132636,"url":"https://github.com/dronperminov/turingcpu","last_synced_at":"2025-08-11T09:15:23.886Z","repository":{"id":107222124,"uuid":"485067034","full_name":"dronperminov/TuringCpu","owner":"dronperminov","description":"Симулятор CPU на машине Тьюринга","archived":false,"fork":false,"pushed_at":"2022-05-06T20:31:13.000Z","size":39064,"stargazers_count":24,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-07-26T01:25:10.029Z","etag":null,"topics":["assembler","assembly","turing-machine"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dronperminov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-04-24T15:36:13.000Z","updated_at":"2025-01-06T21:44:07.000Z","dependencies_parsed_at":null,"dependency_job_id":"96480068-9279-4863-b479-3a32cab356e2","html_url":"https://github.com/dronperminov/TuringCpu","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dronperminov/TuringCpu","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dronperminov%2FTuringCpu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dronperminov%2FTuringCpu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dronperminov%2FTuringCpu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dronperminov%2FTuringCpu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dronperminov","download_url":"https://codeload.github.com/dronperminov/TuringCpu/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dronperminov%2FTuringCpu/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269857730,"owners_count":24486395,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-11T02:00:10.019Z","response_time":75,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["assembler","assembly","turing-machine"],"created_at":"2024-12-01T18:49:00.029Z","updated_at":"2025-08-11T09:15:23.868Z","avatar_url":"https://github.com/dronperminov.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TuringCpu\nСимулятор x86 подобного процессора на машине Тьюринга, использующий упрощённый синтаксис ассемблера на основе NASM. Программа, АЛУ, флаги, регистры, память и стек находятся на одной общей ленте единственной машины Тьюринга.\n\n![Симулятор процессора на МТ](examples/example.gif \"Симулятор процессора на МТ\")\n\n## Конфигурация\n* Произвольная точность вычислений (разрядность), по умолчанию 8 бит\n* Произвольное количество ячеек памяти, по умолчанию 16\n* Шесть регистров общего назначения: `A`, `B`, `C`, `D`, `E`, `F`\n* Флаги:\n    * переполнения (`OF`)\n    * знака (`SF`)\n    * нуля (`ZF`)\n    * переноса (`CF`)\n* поддержка чисел без знака и со знаком\n\n## Синтаксис\n\n* Каждая инструкция располагается на отдельной строке\n* Метки должны начинаться с буквы или точки (`.`) и заканчиваться двоеточием\n* Комментарий начинается с символа `;`\n* Адреса заключаются в квадратные скобки `[address]` и обозначает номер ячейки памяти\n* В качестве адреса может быть положительная константа (`[12]`) или регистр общего назначения (`[A]`)\n* Операндами команд могут быть регистры общего назначения, константы, адреса или метки\n\nОбщий вид строки программы: `метка: инструкция аргументы ; комментарий`\n\n## Допустимые форматы констант:\n\n* Двоичный: `0b1111011` или `1111011b`\n* Восьмеричный: `0o173`\n* Десятичный: `123` или `123d` (в том числе со знаком `-123`)\n* Шестнадцатиричный: `0x7B`\n\n## Команда MOV\nПомещает содержимое аргумента `arg2` в аргумент `arg1`\n\nДопустимая конфигурация аргументов:\n* `MOV регистр, регистр/константа/адрес`\n* `MOV адрес, регистр/константа`\n\nСинтаксис: `MOV arg1, arg2`\n\n## Стековые инструкции\n### Команда PUSH - добавить в стек\nПомещает переданное значение в стек\n\nСинтаксис: `PUSH arg`\n\n### Команда POP - извлечь из стека\nИзвлекает значение из стека и помещает его на переданный регистр. Если стек пуст, происходит ошибка.\n\nСинтаксис: `POP reg`\n\n## Математические операции\nМодифицируют значения флагов `OF`, `SF`, `ZF` и `CF`\n\n* Сложение: `ADD reg, arg`\n* Вычитание: `SUB reg, arg`\n* Умножение: `MUL reg, arg` (без поддежрки `OF` пока)\n* Деление: `DIV reg, arg` (без поддежрки `OF` пока)\n* Инкремент: `INC reg`\n* Декремент: `DEC reg`\n* Изменение знака: `NEG reg`\n\n## Логические операции\nМодифицируют значение флагов `ZF` и `SF`. Флаги `OF` и `CF` сбрасываются\n\n* И: `AND reg, arg`\n* ИЛИ: `OR reg, arg`\n* Исключающее ИЛИ: `XOR reg, arg`\n* НЕ: `NOT reg`\n\n## Битовые сдвиги\nМодифицируют значение флагов `SF`, `ZF` и `CF`. Флаг `OF` сбрасывается\n* Сдвиг влево: `SHL reg, arg`\n* Сдвиг вправо: `SHR reg, arg`\n* Циклический сдвиг влево: `ROL reg`\n* Циклический сдвиг вправо: `ROR reg`\n\n## Команда CMP\nВыполняет вычитание двух чисел. Результат никуда не записывается, модифицируются значения флагов `OF`, `SF`, `ZF` и `CF`\n\nСинтаксис: `CMP reg, arg`\n\n## Команда TEST\nВыполняет логическое И. Результат никуда не записывается, модифицируются значения флагов `ZF` и `SF` и сбрасываются состояния флагов `OF` и `CF`\n\nСинтаксис: `TEST reg, arg`\n\n## Переходы\n### Безусловный переход (JMP)\nПроизводит передачу управления на инструкцию по переданному адресу. В качестве адреса может использовать метка, константа или регистр.\n\nСинтаксис: `JMP address`\n\n### Условные переходы\nРаботают аналогично безусловному переходу, предварительно проверяя некоторое условие:\n\n* `JO` - перейти, если переполнение (`OF = 1`)\n* `JNO` - перейти, если нет переполнения (`OF = 0`)\n* `JS` - перейти, если знак равен 1 (`SF = 1`)\n* `JNS` - перейти, если знак равен 0 (`SF = 0`)\n* `JZ` - перейти, если ноль (`ZF = 1`)\n* `JNZ` - перейти, если не ноль (`ZF = 0`)\n* `JC` - перейти, если перенос (`CF = 1`)\n* `JNC` - перейти, если нет переноса (`CF = 0`)\n* `JE` - перейти, если равно (`ZF = 1`)\n* `JNE` - перейти, если не равно (`ZF = 0`)\n\n#### Переходы беззнакового сравнения\n\n* `JB` - перейти, если меньше (`CF = 1`)\n* `JBE` - перейти, если меньше или равно (`CF = 1` или `ZF = 1`)\n* `JA` - перейти, если больше (`ZF = 0` и `CF = 0`)\n* `JAE` - перейти, если больше или равно (`CF = 0`)\n* `JNB` - перейти, если не меньше (`not \u003c`)\n* `JNBE` - перейти, если не меньше или равно (`not ≤`)\n* `JNA` - перейти, если не больше (`not \u003e`)\n* `JNAE` - перейти, если не больше или равно (`not ≥`)\n\n#### Переходы знакового сравнения\n\n* `JL` - перейти, если меньше (`SF ≠ OF`)\n* `JLE` - перейти, если меньше или равно (`ZF = 1` или `SF ≠ OF`)\n* `JG` - перейти, если больше (`ZF = 0` и `SF = OF`)\n* `JGE` - перейти, если больше или равно (`SF = OF`)\n* `JNL` - перейти, если не меньше (`not \u003c`)\n* `JNLE` - перейти, если не меньше или равно (`not ≤`)\n* `JNG` - перейти, если не больше (`not \u003e`)\n* `JNGE` - перейти, если не больше или равно (`not ≥`)\n\n## Вызов подпрограммы - CALL\nВ стек помещается адрес следующей инструкции, используемый впоследствии командой RET, и выполняется переход по указанному адресу. В качестве адреса, как и в командах переходов, может использоваться метка, константа или регистр.\n\nСинтаксис: `CALL address`\n\n## Выход из подпрограммы - RET\nИзвлекает из стека адрес возврата и выполняет переход на инструкцию по извлечённому адресу.\n\nСинтаксис: `RET`\n\n## Команда HLT\nНемедленно завершает работу процессора\n\nСинтаксис: `HLT`\n\n## Пример программы\n```asm\nJMP start\n\n.loop:\n    CALL fibonacci\n    DEC A   ; уменьшаем номер\n    JNZ .loop\n\n    MOV A, B ; записывем результат в А\n    HLT\n\nstart:\n    MOV A, 11 ; номер числа Фибоначчи\n    XOR B, B\n    MOV C, 0x1\n    CMP A, 12\n    CMP A, 11\n    CMP A, 10\n    JMP .loop\n\n; функция вычисления следующего числа Фибоначчи\n; два соседних члена последовательности располагаются\n; в регистрах C и B соответственно\n; результат записывается в регистр B\nfibonacci:\n    PUSH B ; сохраняем предыдущий член последовательности\n    ADD B, C ; вычисляем новый\n    POP C ; возвращаем сохранённый на место предыдущего\n    RET ; выходим из подпрограммы\n\n```\n\n## Скриншоты работы\n![Пример 1](examples/example1.png \"Пример 1\")\n![Пример 2](examples/example2.png \"Пример 2\")\n![Пример 3](examples/example3.png \"Пример 3\")\n![Пример 4](examples/example4.png \"Пример 4\")\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdronperminov%2Fturingcpu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdronperminov%2Fturingcpu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdronperminov%2Fturingcpu/lists"}