component:wikiasm v2.0
Пишите страницы WikiJump на настоящем ассемблере. Интерпретатор x86-вдохновлённого ASM прямо в браузере.
▶ О компоненте
WikiAsm — компонент для нашей вики, позволяющий писать содержимое страниц на языке ассемблера (x86-инспирированный синтаксис Intel). Передайте ассемблерный код через параметр `|code=` — и браузер исполнит его, генерируя HTML-вывод.
Интерпретатор поддерживает: секции `.data`/`.code`, директивы `db`/`dw`/`dd`/`equ`/`resb`, препроцессор `%define`, 8 регистров, полный набор флагов (ZF, SF, CF, OF, PF), инструкции x86 и 45 системных вызовов `INT 80h` для вывода богатого контента.
◈ Как использовать
[[include component:wikiasm
|code=
section .data
title db "Моя страница"
body db "Привет из ассемблера!"
section .code
MOV AX, 1 ; syscall H1
MOV BX, title
INT 80h
MOV AX, 4 ; параграф
MOV BX, body
INT 80h
HLT
]]
◈ Параметры компонента
codeобязательныйmultiline string
Исходный код WikiAsm. Может содержать секции `.data` и `.code`, директивы, метки и инструкции. Препроцессорные директивы `%define` обрабатываются до парсинга. Комментарии начинаются с `;`.
⚙ Препроцессор
Директива `%define` позволяет создавать именованные константы или псевдонимы, которые будут подставлены по всему коду до парсинга:
%define SYSCALL_H1 1
%define SYSCALL_P 4
%define LIMIT 10
section .code
MOV AX, SYSCALL_H1 ; станет: MOV AX, 1
MOV CX, LIMIT ; станет: MOV CX, 10
⚙ Регистры
Доступно 8 регистров общего назначения:
| Регистр | Назначение | Примечание |
|---|---|---|
| AX | Аккумулятор | Номер syscall; результат MUL/DIV |
| BX | База | 1-й аргумент syscall (текст/строка) |
| CX | Счётчик | 2-й аргумент syscall; счётчик LOOP |
| DX | Данные | 3-й аргумент syscall; остаток DIV |
| SI | Индекс источника | Индексный регистр |
| DI | Индекс назначения | Индексный регистр |
| BP | Указатель базы | Базовый указатель кадра стека |
| SP | Указатель стека | Управляется PUSH/POP (справочно) |
⚙ Флаги
| Флаг | Название | Устанавливается |
|---|---|---|
| ZF | Zero Flag | Результат равен нулю |
| SF | Sign Flag | Результат отрицателен |
| CF | Carry Flag | Перенос/заём в ADD/SUB; используется ADC/SBB, JC/JNC |
| OF | Overflow Flag | Знаковое переполнение; используется JO/JNO |
| PF | Parity Flag | Чётное число битов в младшем байте; JP/JNP |
⚙ Директивы секции .data
| Синтаксис | Тип | Пример |
|---|---|---|
| метка db "строка" | Строка | greeting db "Привет!" |
| метка dw число | Целое 16 бит | count dw 10 |
| метка dd число | Целое 32 бит | bignum dd 100000 |
| метка equ константа | Константа | MAX equ 255 |
| метка resb N | Резерв (= 0) | buf resb 16 |
⚙ Таблица инструкций
| Инструкция | Синтаксис | Описание |
|---|---|---|
| MOV | MOV dst, src | Копировать src в dst |
| XCHG | XCHG r1, r2 | Обменять значения двух регистров |
| LEA | LEA reg, метка | Загрузить числовое значение метки данных |
| ADD | ADD dst, src | dst = dst + src; обновляет ZF SF CF OF |
| ADC | ADC dst, src | dst = dst + src + CF |
| SUB | SUB dst, src | dst = dst - src; обновляет ZF SF CF OF |
| SBB | SBB dst, src | dst = dst - src - CF |
| MUL | MUL reg | AX = AX × reg |
| IMUL | IMUL reg или IMUL dst, src | Знаковое умножение (AX×reg или dst×src) |
| DIV | DIV reg | AX = AX ÷ reg; DX = остаток |
| IDIV | IDIV reg | Знаковое деление |
| INC / DEC | INC reg | Регистр ± 1 |
| NEG | NEG reg | Изменить знак |
| AND / OR / XOR | AND dst, src | Побитовые операции |
| NOT | NOT reg | Побитовое НЕ |
| SHL / SHR | SHL reg, n | Логический сдвиг влево/вправо |
| SAR | SAR reg, n | Арифметический сдвиг вправо (сохраняет знак) |
| ROL / ROR | ROL reg, n | Циклический сдвиг влево/вправо |
| BSWAP | BSWAP reg | Обратить порядок байт в регистре |
| CMP | CMP dst, src | Установить флаги по dst−src (без изменения dst) |
| TEST | TEST dst, src | Установить флаги по dst & src |
| JMP | JMP метка | Безусловный переход |
| JE/JZ JNE/JNZ | JE метка | Переход: равно / не равно |
| JG JGE JL JLE | JG метка | Переход: > >= < <= (после CMP) |
| JS / JNS | JS метка | Переход: SF=1 / SF=0 |
| JC / JNC | JC метка | Переход: CF=1 / CF=0 |
| JO / JNO | JO метка | Переход: OF=1 / OF=0 |
| JP / JNP | JP метка | Переход: PF=1 / PF=0 |
| JCXZ | JCXZ метка | Переход если CX = 0 |
| LOOP | LOOP метка | DEC CX; переход если CX ≠ 0 |
| LOOPZ / LOOPNZ | LOOPZ метка | LOOP + ZF=1 / ZF=0 |
| SETcc | SETE reg | Установить reg = 0/1 по условию (E NE G L GE LE S NS C NC) |
| PUSH / POP | PUSH reg | Стек |
| PUSHF / POPF | PUSHF | Сохранить / восстановить регистр флагов |
| CALL / RET | CALL метка | Вызов подпрограммы / возврат |
| INT 80h | INT 80h | Системный вызов |
| STC / CLC / CMC | STC | Установить / сбросить / инвертировать CF |
| STZ / CLZ | STZ | Установить / сбросить ZF |
| HLT | HLT | Завершить выполнение |
| NOP | NOP | Нет операции |
⚙ Таблица системных вызовов — INT 80h
Перед `INT 80h` записывают номер вызова в `AX`, аргументы — в `BX`, `CX`, `DX`.
| AX | Функция | BX | CX | DX |
|---|---|---|---|---|
| 1 | H1 | текст | — | — |
| 2 | H2 | текст | — | — |
| 3 | H3 | текст | — | — |
| 4 | Параграф `<p>` | текст | — | — |
| 5 | Жирный `<strong>` | текст | — | — |
| 6 | Курсив `<em>` | текст | — | — |
| 7 | Зачёркнутый `<del>` | текст | — | — |
| 8 | Линия `<hr>` | — | — | — |
| 9 | Перенос `<br>` | — | — | — |
| 10 | Ссылка `<a>` | текст | URL | — |
| 11 | Инлайн-код `<code>` | текст | — | — |
| 12 | Блок кода `<pre>` | текст | — | — |
| 13 | Цитата `<blockquote>` | текст | — | — |
| 14 | Значение регистра | имя рег. | — | — |
| 15 | Инлайн-текст (без тега) | текст | — | — |
| 16 | `<div class="...">` открыть | CSS-класс | — | — |
| 17 | `</div>` закрыть | — | — | — |
| 18 | `<span class="...">` открыть | CSS-класс | — | — |
| 19 | `</span>` закрыть | — | — | — |
| 20 | Изображение `<img>` | src | alt | px-ширина |
| 21 | Элемент `<ul>` списка | текст | — | — |
| 22 | Элемент `<ol>` списка | текст | — | — |
| 23 | Открыть таблицу | заголовки через | | — | — |
| 24 | Строка таблицы | ячейки через | | — | — |
| 25 | Закрыть таблицу | — | — | — |
| 26 | Отступ (margin) | — | — | — |
| 27 | Число из BX (десятичное) | число/рег | — | — |
| 28 | Число из BX (шестнадцатеричное) | число | — | — |
| 29 | Число из BX (двоичное) | число | — | — |
| 30 | Открыть callout-блок | тип* | заголовок | — |
| 31 | Закрыть callout-блок | — | — | — |
| 32 | Бейдж/тег | текст | цвет CSS | — |
| 33 | Полоса прогресса | подпись | % (0–100) | цвет |
| 34 | Открыть карточку | заголовок | — | — |
| 35 | Закрыть карточку | — | — | — |
| 36 | Строка ключ→значение | ключ | значение | — |
| 37 | Цветной текст (inline) | текст | CSS-цвет | — |
| 38 | Открыть центрирование | — | — | — |
| 39 | Закрыть центрирование | — | — | — |
| 40 | Верхний индекс `<sup>` | текст | — | — |
| 41 | Нижний индекс `<sub>` | текст | — | — |
| 42 | Выделение `<mark>` | текст | цвет фона | — |
| 43 | Число с подписью | число | подпись | — |
| 44 | Клавиша `<kbd>` | текст | — | — |
| 45 | Аббревиатура с подсказкой | текст | описание | — |
*Типы callout (AX=30): `info` · `warn` / `warning` · `danger` / `error` · `success` · `tip`
◈ Пример 1 — Статус-страница с прогрессом
Карточка с полосами прогресса и цветными бейджами.
section .data
ttl db "Статус проекта"
s1 db "Документация"
s2 db "Тестирование"
s3 db "Деплой"
done db "Завершено"
wip db "В работе"
section .code
MOV AX, 34
MOV BX, ttl
INT 80h
MOV AX, 33 ; прогресс-бар
MOV BX, s1
MOV CX, 100
MOV DX, "#00cc66"
INT 80h
MOV BX, s2
MOV CX, 65
MOV DX, "#ffaa00"
INT 80h
MOV BX, s3
MOV CX, 10
MOV DX, "#4488ff"
INT 80h
MOV AX, 35
INT 80h
MOV AX, 32 ; бейджи
MOV BX, done
MOV CX, "#1a4a2a"
INT 80h
MOV BX, wip
MOV CX, "#4a3a00"
INT 80h
HLT
◈ Пример 2 — Цикл с LOOP
Инструкция `LOOP` автоматически декрементирует CX и совершает переход пока CX ≠ 0.
section .data
hdr db "Таблица умножения на 3:"
section .code
MOV AX, 2
MOV BX, hdr
INT 80h
MOV CX, 10 ; счётчик
MOV SI, 1 ; текущее число
iter:
PUSH CX
MOV AX, 27 ; вывести SI
MOV BX, SI
INT 80h
MOV AX, 15
MOV BX, " × 3 = "
INT 80h
MOV AX, SI
MOV BX, 3
MUL BX ; AX = SI * 3
MOV DI, AX ; сохранить результат
MOV AX, 27
MOV BX, DI
INT 80h
MOV AX, 9 ; <br>
INT 80h
INC SI
POP CX
LOOP iter
HLT
◈ Пример 3 — Callout, цвет и %define
Использование препроцессора, callout-блоков и цветного текста.
%define H1 1
%define PARA 4
%define HR 8
section .data
title db "Руководство по WikiAsm v2"
note db "Интерпретатор работает полностью в браузере."
warn db "Максимум 100 000 шагов на одну страницу."
tip db "Используйте %define для удобства."
ctip db "tip"
cwarn db "warn"
section .code
MOV AX, H1
MOV BX, title
INT 80h
MOV AX, PARA
MOV BX, note
INT 80h
MOV AX, 30 ; открыть callout warn
MOV BX, cwarn
MOV CX, warn
INT 80h
MOV AX, 31 ; закрыть callout
INT 80h
MOV AX, 30 ; callout tip
MOV BX, ctip
MOV CX, tip
INT 80h
MOV AX, 31
INT 80h
HLT
LOOP vs JMP-цикл: `LOOP метка` эквивалентно `DEC CX` + `JNZ метка`, но короче. `CX` должен быть установлен до метки цикла.
Ограничения: максимум 100 000 шагов (защита от бесконечных циклов). `INT` с номером ≠ 80h игнорируется. Строки хранятся в регистрах по значению — арифметику над строковыми регистрами не выполнять.



