Память DCPU-16
В других языках вы могли встретиться с понятием "переменная". Переменная — это объект, принимающий произвольное значение. В ассемблере DCPU-16 у нас есть регистры — блоки памяти. В них могут содержаться слова, которые будут храниться внутри процессора, то есть мы сможем очень быстро получать доступ к ним.
В DCPU-16 есть восемь регистров значений:
A, B, C, X, Y, Z, I, J. |
- SP - указатель стека;
PC - счётчик команд;
O - переполнение.
С тремя последними мы познакомимся поближе, когда изучим стек. Сейчас же мы изучим использование регистров. Для получения доступа к ним нам нужно использовать инструкции.
Инструкции
Давайте взглянем на список основных инструкций:
Код | Инструкция | Комментарий |
0х0 | N/A | не основная, см. далее |
0х1 | SET a, b | присваивает a значение b |
0х2 | ADD a, b | присваивает a значение a+b, в случае переполнения присваивает регистру переполнения O значение 0x0001, иначе — 0х0 |
0х3 | SUB a, b | присваивает a значение а-b, в случае переполнения присваивает регистру переполнения O значение 0xffff, иначе — 0х0 |
0х4 | MUL a, b | присваивает а значение a*b, присваивает регистру переполнения O значение ((a*b)>>16)&0xffff |
0x5 | DIV a, b | присваивает а значение а/b, присваивает регистру переполнения O значение ((a<<16)/b)&0xffff. Если же b==0, присваивает а и O значение 0 |
0x6 | MOD a, b | присваивает а значение а%b. Если же b==0, присваивает а значение 0 |
0x7 | SHL a, b | присваивает а значение а<<b, присваивает регистру переполнения O ((a<<b)>>16)&0xffff |
0x8 | SHR a, b | присваивает а значение а>>b, присваивает регистру переполнения O значение ((a<<16)>>b)&0xffff |
0x9 | AND a, b | присваивает а значение a&b |
0xa | BOR a, b | присваивает а значение a|b |
0xb | XOR a, b | присваивает а значение a^b |
0xc | IFE a, b | выполняет следующую инструкцию только тогда, когда a==b |
0xd | IFN a, b | выполняет следующую инструкцию только тогда, когда a!=b |
0xe | IFG a, b | выполняет следующую инструкцию только тогда, когда a>b |
0xf | IFB a, b | выполняет следующую инструкцию только тогда, когда (a&b)!=0 |
Итак, приступим!
SET
SET используется для присвоения регистру некоторого значения. Давайте возьмём регистр А и присвоим ему значение 10. Наша инструкция будет выглядеть так:
SET A, 10 |
ADD, SUB, MUL, DIV
А вот и четвёрка основных операций: сложение, вычитание, умножение и деление. Использовать их крайне просто: как и в случае с инструкцией SET, сначала нужно выбрать регистр. На этот раз выберем B.
Сначала нужно присвоить значение, а уже потом использовать операцию. Если нам нужно сложить 20 и 30, поступим так:
SET B, 30
ADD B, 20 |
С остальными операндами можно поступить точно так же.
SET B, 30
SUB B, 10 |
SET B, 6
MUL B, 3 |
Порядок операций
Допустим, нам надо вычислить 30+5*10. Нужно помнить, что умножение проводится перед сложением. Код будет таким:
SET A, 10
MUL A, 5 ADD A, 30 |
Использование нескольких регистров
Порой необходимо использовать не один, а два и более регистров, но это довольно легко реализовать.
Пусть нам надо вычислить 15*3+20*4, для этого нужно два регистра.
SET A, 15
SET B, 20 MUL A, 3 MUL B, 4 ADD A, B |
Нахождение остатка от деления
Инструкция MOD находит остаток, когда делится делимое. Например:
SET A, 15
MOD A, 4 |
SET A, 15
MOD A, 5 |
В следующей части учебника мы рассмотрим условные инструкции. При создании поста использовались