component:wikiasm v1.0
Пишите страницы WikiJump на настоящем ассемблере. Интерпретатор x86-вдохновлённого ASM прямо в браузере.
▶ О компоненте
WikiAsm — компонент для WikiJump, позволяющий писать содержимое страниц на языке ассемблера (x86-инспирированный синтаксис Intel). Вы вставляете компонент на страницу, передаёте ему ассемблерный код — и браузер исполняет его, генерируя HTML-вывод.
Интерпретатор поддерживает реальный ассемблерный синтаксис: секции `.data` и `.code`, директивы `db`/`dw`, все основные инструкции (MOV, ADD, CMP, JMP, CALL, PUSH/POP и др.) и систему прерываний `INT 80h` для вывода содержимого страницы.
◈ Как использовать
Вставьте компонент на пустую страницу и передайте ассемблерный код через параметр `|code=`:
[[include component:wikiasm
|code=
section .data
title db "Моя страница"
body db "Привет из ассемблера!"
section .code
MOV AX, 1 ; syscall H1
MOV BX, title ; BX = указатель на строку
INT 80h ; вывод заголовка
MOV AX, 4 ; syscall параграф
MOV BX, body
INT 80h
HLT ; завершение
]]
◈ Параметры компонента
codeобязательныйmultiline string
Исходный код на языке WikiAsm. Передаётся напрямую в интерпретатор. Может содержать секции `.data` и `.code`, метки, директивы и любые поддерживаемые инструкции. Комментарии начинаются с символа `;` и игнорируются.
◈ Архитектура языка
WikiAsm использует синтаксис Intel (операнд назначения — слева). Программа разделена на две необязательные секции:
- `section .data` — объявление именованных данных (строк и чисел)
- `section .code` — исполняемые инструкции
Если секции не объявлены, весь код считается принадлежащим `.code`.
⚙ Регистры
Доступно 7 регистров общего назначения:
| Регистр | Назначение | Примечание |
|---|---|---|
| AX | Аккумулятор | Основной операнд, номер syscall для INT 80h, результат MUL/DIV |
| BX | База | Первый аргумент syscall (текст/строка) |
| CX | Счётчик | Второй аргумент syscall (URL и т.п.), счётчик циклов |
| DX | Данные | Третий аргумент syscall (ширина), остаток от DIV |
| SI | Индекс источника | Индексный регистр |
| DI | Индекс назначения | Индексный регистр |
| SP | Указатель стека | Автоматически управляется PUSH/POP (справочно) |
⚙ Директивы секции .data
| Синтаксис | Тип | Пример |
|---|---|---|
| метка db "строка" | Строка | greeting db "Привет, мир!" |
| метка dw число | Целое число | count dw 10 |
| метка equ константа | Константа | MAX equ 100 |
Данные доступны по имени метки в любом аргументе инструкции.
⚙ Таблица инструкций
| Инструкция | Синтаксис | Описание |
|---|---|---|
| MOV | MOV dst, src | Копировать значение src в регистр dst |
| ADD | ADD dst, src | dst = dst + src; устанавливает флаги |
| SUB | SUB dst, src | dst = dst - src; устанавливает флаги |
| MUL | MUL reg | AX = AX × reg |
| DIV | DIV reg | AX = AX ÷ reg; DX = остаток |
| INC / DEC | INC reg | Увеличить / уменьшить регистр на 1 |
| NEG | NEG reg | Изменить знак регистра |
| AND / OR / XOR | AND dst, src | Побитовые операции |
| NOT | NOT reg | Побитовое НЕ |
| SHL / SHR | SHL reg, n | Сдвиг влево / вправо на n бит |
| CMP | CMP dst, src | Установить флаги по dst - src (без изменения dst) |
| JMP | JMP метка | Безусловный переход |
| JE / JZ | JE метка | Переход если равно (ZF=1) |
| JNE / JNZ | JNE метка | Переход если не равно (ZF=0) |
| JG / JGE | JG метка | Переход если больше / больше или равно |
| JL / JLE | JL метка | Переход если меньше / меньше или равно |
| PUSH / POP | PUSH reg | Положить значение на стек / снять со стека |
| CALL | CALL метка | Вызов подпрограммы (сохраняет адрес возврата) |
| RET | RET | Возврат из подпрограммы |
| INT 80h | INT 80h | Системный вызов (syscall) — вывод на страницу |
| HLT | HLT | Остановить выполнение программы |
| NOP | NOP | Нет операции |
⚙ Таблица системных вызовов — INT 80h
Перед `INT 80h` записывают номер вызова в `AX`, первый аргумент в `BX`, второй — в `CX`, третий — в `DX`.
| AX | Функция | BX | CX | DX | HTML-вывод |
|---|---|---|---|---|---|
| 1 | Заголовок H1 | текст | — | — | @h1>...</h1@ |
| 2 | Заголовок H2 | текст | — | — | @h2>...</h2@ |
| 3 | Заголовок H3 | текст | — | — | @h3>...</h3@ |
| 4 | Параграф | текст | — | — | @p>...</p@ |
| 5 | Жирный текст | текст | — | — | @strong>...</strong@ |
| 6 | Курсив | текст | — | — | @em>...</em@ |
| 7 | Зачёркнутый | текст | — | — | @del>...</del@ |
| 8 | Горизонтальная линия | — | — | — | @hr@ |
| 9 | Перенос строки | — | — | — | @br@ |
| 10 | Ссылка | текст | URL | — | @a href="...">...</a@ |
| 11 | Строчный код | текст | — | — | @code>...</code@ |
| 12 | Блок кода@pre@ | текст | — | — | @pre>...</pre@ |
| 13 | Цитата | текст | — | — | @blockquote>...</blockquote@ |
| 14 | Вывод числа из регистра | имя регистра | — | — | @span>число</span@ |
| 15 | Встроенный текст | текст | — | — | без тега |
| 16 | Открыть@div@ | CSS-класс | — | — | @div class="..."@ |
| 17 | Закрыть@/div@ | — | — | — | @/div@ |
| 18 | Открыть@span@ | CSS-класс | — | — | @span class="..."@ |
| 19 | Закрыть@/span@ | — | — | — | @/span@ |
| 20 | Изображение | src | alt-текст | ширина px | @img src="..."@ |
| 21 | Элемент маркированного списка | текст | — | — | @ul><li>...</li@ |
| 22 | Элемент нумерованного списка | текст | — | — | @ol><li>...</li@ |
| 23 | Открыть таблицу | заголовки через | | — | — | @table><thead@ |
| 24 | Строка таблицы | ячейки через | | — | — | @tr><td>...</td@ |
| 25 | Закрыть таблицу | — | — | — | @/tbody></table@ |
| 26 | Пустое пространство | — | — | — | @div style="margin:12px 0"@ |
◈ Пример 1 — Простая страница
Минимальный пример: заголовок, параграф и горизонтальная черта.
;;; Пример 1: Простая страница
section .data
title db "Добро пожаловать"
intro db "Эта страница написана на ассемблере."
footer db "Создано с помощью WikiAsm."
section .code
MOV AX, 1 ; syscall: H1
MOV BX, title ; аргумент: строка
INT 80h
MOV AX, 4 ; syscall: параграф
MOV BX, intro
INT 80h
MOV AX, 8 ; syscall: <hr>
INT 80h
MOV AX, 4
MOV BX, footer
INT 80h
HLT
◈ Пример 2 — Цикл и нумерованный список
Использование счётчика `CX` для вывода нескольких элементов циклом.
;;; Пример 2: Цикл — вывод чисел от 1 до 5
section .data
heading db "Числа от 1 до 5:"
item db "Элемент #"
section .code
MOV AX, 2 ; H2
MOV BX, heading
INT 80h
MOV CX, 1 ; счётчик = 1
loop_start:
CMP CX, 6 ; если CX >= 6 — выход
JGE loop_end
MOV AX, 22 ; syscall: элемент OL
MOV BX, 14 ; BX = значение CX (14 = DX = AX / так передаём число)
; Чтобы вывести число из регистра — используем AX=27
PUSH CX ; сохранить CX
MOV AX, 27
MOV BX, CX
INT 80h
POP CX
INC CX
JMP loop_start
loop_end:
HLT
◈ Пример 3 — Подпрограммы (CALL/RET) и таблица
Полноценная страница с заголовком, таблицей и текстом. Использует `CALL` для повторно используемых блоков.
;;; Пример 3: Подпрограммы и таблица
section .data
pg_title db "Таблица регистров WikiAsm"
col_hdr db "Регистр | Назначение | Размер"
row1 db "AX | Аккумулятор | 16 бит"
row2 db "BX | База / аргумент | 16 бит"
row3 db "CX | Счётчик | 16 бит"
row4 db "DX | Данные / остаток | 16 бит"
footer db "Все регистры поддерживают 32-битные значения в WikiAsm."
section .code
MOV AX, 1
MOV BX, pg_title
INT 80h
; Открыть таблицу с заголовками
MOV AX, 23
MOV BX, col_hdr
INT 80h
; Вызов подпрограммы для каждой строки
MOV BX, row1 ; аргумент для подпрограммы
CALL print_row
MOV BX, row2 CALL print_row
MOV BX, row3 CALL print_row
MOV BX, row4 CALL print_row
; Закрыть таблицу
MOV AX, 25
INT 80h
MOV AX, 13 ; blockquote
MOV BX, footer
INT 80h
HLT
;;; Подпрограмма: вывести строку таблицы (BX = строка)
print_row:
PUSH AX
PUSH BX
MOV AX, 24 ; syscall: строка таблицы
; BX уже содержит нужную строку
INT 80h
POP BX
POP AX
RET
Совет: Список `21/22` закрывается автоматически при следующем вызове любого другого syscall. Для цикла с числами используйте `AX=27` (`MOV BX, CX` + `INT 80h`) — это выводит значение регистра как число.
Ограничения: максимум 50 000 шагов на одну страницу (защита от бесконечных циклов). `INT` с номером, отличным от `80h`, игнорируется. Строки в регистрах — это ссылки на метки `.data` или строковые литералы в кавычках.
◈ Быстрый старт — скопируйте и вставьте
Минимальный шаблон для новой страницы на ассемблере:
[[include component:wikiasm
|code=
section .data
title db "Моя страница"
text1 db "Первый параграф текста."
text2 db "Второй параграф текста."
section .code
MOV AX, 1
MOV BX, title
INT 80h
MOV AX, 8
INT 80h
MOV AX, 4
MOV BX, text1
INT 80h
MOV AX, 4
MOV BX, text2
INT 80h
HLT
]]



