Assembly

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

Данные доступны по имени метки в любом аргументе инструкции.


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

ИнструкцияСинтаксисОписание
MOVMOV dst, srcКопировать значение src в регистр dst
ADDADD dst, srcdst = dst + src; устанавливает флаги
SUBSUB dst, srcdst = dst - src; устанавливает флаги
MULMUL regAX = AX × reg
DIVDIV regAX = AX ÷ reg; DX = остаток
INC / DECINC regУвеличить / уменьшить регистр на 1
NEGNEG regИзменить знак регистра
AND / OR / XORAND dst, srcПобитовые операции
NOTNOT regПобитовое НЕ
SHL / SHRSHL reg, nСдвиг влево / вправо на n бит
CMPCMP dst, srcУстановить флаги по dst - src (без изменения dst)
JMPJMP меткаБезусловный переход
JE / JZJE меткаПереход если равно (ZF=1)
JNE / JNZJNE меткаПереход если не равно (ZF=0)
JG / JGEJG меткаПереход если больше / больше или равно
JL / JLEJL меткаПереход если меньше / меньше или равно
PUSH / POPPUSH regПоложить значение на стек / снять со стека
CALLCALL меткаВызов подпрограммы (сохраняет адрес возврата)
RETRETВозврат из подпрограммы
INT 80hINT 80hСистемный вызов (syscall) — вывод на страницу
HLTHLTОстановить выполнение программы
NOPNOPНет операции

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

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

AXФункцияBXCXDXHTML-вывод
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Изображениеsrcalt-текстширина 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
]]

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