Учебник по DCPU-16. Часть 1: Знакомство с регистрами и инструкциями

Память DCPU-16

В других языках вы могли встретиться с понятием "переменная". Переменная — это объект, принимающий произвольное значение. В ассемблере DCPU-16 у нас есть регистры — блоки памяти. В них могут содержаться слова, которые будут храниться внутри процессора, то есть мы сможем очень быстро получать доступ к ним.

В DCPU-16 есть восемь регистров значений:

A, B, C, X, Y, Z, I, J.

А еще есть три дополнительных:

    SP - указатель стека;

    PC - счётчик команд;

    O - переполнение.

С тремя последними мы познакомимся поближе, когда изучим стек. Сейчас же мы изучим использование регистров. Для получения доступа к ним нам нужно использовать инструкции.

[line]

Инструкции

Давайте взглянем на список основных инструкций:

КодИнструкцияКомментарий

0х0N/Aне основная, см. далее

0х1SET a, bприсваивает a значение b

0х2ADD a, bприсваивает a значение a+b, в случае переполнения присваивает регистру переполнения O значение 0x0001, иначе — 0х0

0х3SUB a, bприсваивает a значение а-b, в случае переполнения присваивает регистру переполнения O значение 0xffff, иначе — 0х0

0х4MUL a, bприсваивает а значение a*b, присваивает регистру переполнения O значение ((a*b)>>16)&0xffff

0x5DIV a, bприсваивает а значение а/b, присваивает регистру переполнения O значение ((a<<16)/b)&0xffff. Если же b==0, присваивает а и O значение 0

0x6MOD a, bприсваивает а значение а%b. Если же b==0, присваивает а значение 0

0x7SHL a, bприсваивает а значение а<>16)&0xffff

0x8SHR a, bприсваивает а значение а>>b, присваивает регистру переполнения O значение ((a<<16)>>b)&0xffff

0x9AND a, bприсваивает а значение a&b

0xaBOR a, bприсваивает а значение a|b

0xbXOR a, bприсваивает а значение a^b

0xcIFE a, bвыполняет следующую инструкцию только тогда, когда a==b

0xdIFN a, bвыполняет следующую инструкцию только тогда, когда a!=b

0xeIFG a, bвыполняет следующую инструкцию только тогда, когда a>b

0xfIFB a, bвыполняет следующую инструкцию только тогда, когда (a&b)!=0

Сейчас мы рассмотрим следующие инструкции: SET, ADD, SUB, MUL, DIV, MOD. Условные инструкции IFE, IFN, IFG, IFB будут рассмотрены в следующей части учебника.

Итак, приступим!

[line]

SET

SET используется для присвоения регистру некоторого значения. Давайте возьмём регистр А и присвоим ему значение 10. Наша инструкция будет выглядеть так:

SET A, 10

Теперь регистр А принял значение 10.

[line]

ADD, SUB, MUL, DIV

А вот и четвёрка основных операций: сложение, вычитание, умножение и деление. Использовать их крайне просто: как и в случае с инструкцией SET, сначала нужно выбрать регистр. На этот раз выберем B.

Сначала нужно присвоить значение, а уже потом использовать операцию. Если нам нужно сложить 20 и 30, поступим так:

SET B, 30

ADD B, 20

Теперь B принял значение 50.

С остальными операндами можно поступить точно так же.

SET B, 30

SUB B, 10

Даст нам значение 20.

SET B, 6

MUL B, 3

Даст нам значение 18.

Порядок операций

Допустим, нам надо вычислить 30+5*10. Нужно помнить, что умножение проводится перед сложением. Код будет таким:

SET A, 10

MUL A, 5

ADD A, 30

Нетрудно догадаться, что мы получим 80.

[line]

Использование нескольких регистров

Порой необходимо использовать не один, а два и более регистров, но это довольно легко реализовать.

Пусть нам надо вычислить 15*3+20*4, для этого нужно два регистра.

SET A, 15

SET B, 20

MUL A, 3

MUL B, 4

ADD A, B

Результатом будет 125. Это значение хранится в А, как было оговорено в определении инструкции АDD.

[line]

Нахождение остатка от деления

Инструкция MOD находит остаток, когда делится делимое. Например:

SET A, 15

MOD A, 4

Мы делим 15 на 4, в регистре А теперь хранится значение остатка — 3. Если производится деление нацело, регистр примет значение 0. Например:

SET A, 15

MOD A, 5

А принял значение 0, поскольку 15 делится на 5 без остатка.

[line]

В следующей части учебника мы рассмотрим условные инструкции. При создании поста использовались DCPU-16 DASM Assembly Tutorials.