Wikiasm

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 (справочно)

Флаги

ФлагНазваниеУстанавливается
ZFZero FlagРезультат равен нулю
SFSign FlagРезультат отрицателен
CFCarry FlagПеренос/заём в ADD/SUB; используется ADC/SBB, JC/JNC
OFOverflow FlagЗнаковое переполнение; используется JO/JNO
PFParity 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

Таблица инструкций

ИнструкцияСинтаксисОписание
MOVMOV dst, srcКопировать src в dst
XCHGXCHG r1, r2Обменять значения двух регистров
LEALEA reg, меткаЗагрузить числовое значение метки данных
ADDADD dst, srcdst = dst + src; обновляет ZF SF CF OF
ADCADC dst, srcdst = dst + src + CF
SUBSUB dst, srcdst = dst - src; обновляет ZF SF CF OF
SBBSBB dst, srcdst = dst - src - CF
MULMUL regAX = AX × reg
IMULIMUL reg или IMUL dst, srcЗнаковое умножение (AX×reg или dst×src)
DIVDIV regAX = AX ÷ reg; DX = остаток
IDIVIDIV regЗнаковое деление
INC / DECINC regРегистр ± 1
NEGNEG regИзменить знак
AND / OR / XORAND dst, srcПобитовые операции
NOTNOT regПобитовое НЕ
SHL / SHRSHL reg, nЛогический сдвиг влево/вправо
SARSAR reg, nАрифметический сдвиг вправо (сохраняет знак)
ROL / RORROL reg, nЦиклический сдвиг влево/вправо
BSWAPBSWAP regОбратить порядок байт в регистре
CMPCMP dst, srcУстановить флаги по dst−src (без изменения dst)
TESTTEST dst, srcУстановить флаги по dst & src
JMPJMP меткаБезусловный переход
JE/JZ JNE/JNZJE меткаПереход: равно / не равно
JG JGE JL JLEJG меткаПереход: > >= < <= (после CMP)
JS / JNSJS меткаПереход: SF=1 / SF=0
JC / JNCJC меткаПереход: CF=1 / CF=0
JO / JNOJO меткаПереход: OF=1 / OF=0
JP / JNPJP меткаПереход: PF=1 / PF=0
JCXZJCXZ меткаПереход если CX = 0
LOOPLOOP меткаDEC CX; переход если CX ≠ 0
LOOPZ / LOOPNZLOOPZ меткаLOOP + ZF=1 / ZF=0
SETccSETE regУстановить reg = 0/1 по условию (E NE G L GE LE S NS C NC)
PUSH / POPPUSH regСтек
PUSHF / POPFPUSHFСохранить / восстановить регистр флагов
CALL / RETCALL меткаВызов подпрограммы / возврат
INT 80hINT 80hСистемный вызов
STC / CLC / CMCSTCУстановить / сбросить / инвертировать CF
STZ / CLZSTZУстановить / сбросить ZF
HLTHLTЗавершить выполнение
NOPNOPНет операции

Таблица системных вызовов — INT 80h

Перед `INT 80h` записывают номер вызова в `AX`, аргументы — в `BX`, `CX`, `DX`.

AXФункцияBXCXDX
1H1текст
2H2текст
3H3текст
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>`srcaltpx-ширина
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 игнорируется. Строки хранятся в регистрах по значению — арифметику над строковыми регистрами не выполнять.

_default: компонент
версия страницы: 2, Последняя правка: 02 Апрель 2026, 13:18 (6 дней назад)
Пока не указано иное, содержимое этой страницы распространяется по лицензии Creative Commons Attribution-ShareAlike 3.0 License.