Wct — сумасшедшее программирование

в 12:54, , рубрики: Wct, вынос мозга, ненормальное программирование, Программирование, метки: ,

Привет всем программистам. Особенно любителям поломать свою голову. Хочу поведать вам о такой штуке, как Wct.

Что такое Wct?

Wct — система счисления, которая состоит полностью из букв и предназначена, в общем, для «взрыва» своих мозгов. В Wct всего 16 символов, а именно:

A, B, C, D, E, F, G, H, I, J, K, L, M, N, P, O

(идентична HEX, но полностью состоит из букв).
Да-да, всё верно, O идёт после P (что тоже значительно усложняет процесс написания программ в некоторых случаях, особенно, если вы новичок).

Начало

Так, а что же у нас с командами? Хорошо, сейчас я приведу вам несколько примеров. Сразу скажу, что на Wct легче всего написать программу для Dos, нежели чем для Linux или Windows (сложно, но можно). Поэтому мы напишем 3 программы для DOS-a.

LI AA AA — скопирует «0» в регистр «ax». Почему AA AA? Нет, это не крик отчаяния, это всего лишь число (в десятичной системе счисления — 0). Но теперь у вас наверняка возникло ещё больше вопросов. Почему 4 буквы «A»? Разве одной было бы недостаточно? Нет. "** **" может вместить в себе числа аж до 65535 (не больше). Четырёх букв будет достаточно Wct Editor-у, чтобы объявить число, размером от 0 до 65535. А что же нам делать, если мы хотим запихнуть в регистр число, которое больше 65535? Ответ прост — поместим число в регистр eax. В нём мы можем хранить числа до 4294967295 (при написании программ советую учесть то, что команда занимает 6 байтов). Чтобы объявить это число и поместить в eax, мы используем команду GG LI AA AA AA AA, где GG LI — копирование 0 в eax, а AA AA AA AA — 0.

Внимание! Дальнейшее чтение данного текста может привести к выносу мозга и повреждению рассудка.

Сейчас я разберу для вас программу «Hello World». Собственно, ниже вы можете увидеть исходный код программы «Привет, Мир»:

LE AJ; mov ah,AJw // это комментарии, которые зачастую оказываются очень полезными
LK AN AB; mov dx,hello
MN CB; int CBw
LE AI; mov ah,Iw
MN CB; int CBw
MN CA; int CAw
AN AK EI GJ CB CE; Текст «Hi!»

Ну, что же, давайте разбираться, что это такое, и что делает этот код.

LE AJ — помещает в регистр ah число AJ (подробнее о регистрах вы можете прочитать на www.esolangs.org/wiki/Wct).
LK AN AB — помещает в регистр DX адрес нашего приветствия, где LK — перемещение в dx, AN — адрес сообщения, а AB (1) — указатель того, что мы используем смещение 100h.
MN CB — всемирно известное прерывание int 21h. Это прерывание служит главным входом большинства функций DOS. Так как мы уже поместили в ah число AJ (9) — текстовой режим, то мы смело можем применять данное прерывание.
LE AI — системный таймер.
MN CB — я уже объяснил, что сие значит. Опять же прерывание 21h, или CBw.
MN CA — уже новое для вас прерывание — int 20h (CAw). Проще говоря, это завершение нашей программы.
AN AK EI GJ CB CE — это уже текст «Hi!$», где AN AK — указатели на то, что сейчас будет объявлен текст, а EI GJ CB CE — сам текст. Внимание! Не забывайте использовать знак "$".

Второй мозговыносящий пример (уже интереснее). Генератор музыки.

*Кхм-кхм*, начнём разбор и одновременное написание программы.

PE EA — посылает нам «младший» байт делителя.
DI MI — сравнивает регистры al и cl.
HF OK — если cl не равен al, то идём далее.
GG EJ — уменьшает ecx на единичку.
GG AO KE MI BG — вот пример, где две буквы «GG» отвечают за разные команды. AO указывает то, что мы будем сдвигать операнд приемник влево на 22 (BG), KE — eax, MI — ecx (запомните это, пожалуйста).
IJ MD — перемещаем в bx значение регистра ax (в данном случае используется IJ).
OH ND — это команда not bx (не bx).
OH PD — команда mul bx — умножение.
OH PB — тоже умножение.
MB PL AD — сдвигаем все биты регистра bx вправо на 3 байта.
CB NI — условие «И» с применением регистров ax и bx.
LK HI AD — помещает в регистр dx число 378h.
PP — команда out dx, al, собственно.
И, наконец, PL PA — прыжок на GG EJ.

И, наконец, напишем третью программу, пока ваши мозги не вскипели. Это будет «Матрица».

ME MB — ME — загружаем регистр si в bx — ES:BX.
JO — копируем флаги SF, ZF, AF, PF, CF в разряды 7, 6, 4, 2, 0 регистра ah.
KL — переписываем содержимое АХ в ячейку памяти с адресом ES: (E)DI, после чего прибавляет 2 к (E)DI, если флаг D опущен, и вычитает 2, если D поднят.
EH — увеличиваем регистр di на единицу.
EH — опять увеличиваем. Можно было бы и ID MH AB, но, как видите, тут аж 3 байта. Конечно, удобнее использовать EH.
PL OJ — переход на старт с увеличением на единицу.

Вот, вроде бы, и объяснил. Надеюсь, вам было интересно.

Хорошо, а как мне собрать исходный код?
Для этого есть «Wct Editor».

Скачать её можно по ссылке: http://www.github.com/mihip/wct.

Внимание! Все исходные коды на wct для wct editor нужно собирать в одну строку без пробелов. Пример: «AA AA AA» — не правильно, «AAAAAA» — правильно.

Ещё раз дам ссылку на вики-страничку на сайте EsoLangs: http://www.esolangs.org/wiki/wct

Спасибо за внимание, до скорой встречи.

image

Автор: Mihip

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js