Учебник по 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.