Программирование в машинных кодах и на языке ассемблера 1993 г.

Первые шаги в машинных кодах - Архитектура процессора Z-80.


3. Архитектура процессора Z-80.

 

Процессор Z-80 был создан американской корпорацией ZILOG и явился одним из самых удачных процессоров в мире. Он имеет 8-ми разрядную шину данных и 16-ти разрядную адресную шину. Это означает, что он может обрабатывать целые числа (байты) от 0 до 255 (т.к. 28-1 = 255) и напрямую обращаться к 65535 ячейкам памяти (т.к. 216-1=65535).

В структуру процессора входят несколько регистров. Именно с ними мы и работаем, программируя в машинном коде. Рассматривайте эти регистры как ячейки внутренней памяти процессора. Если из ячеек постоянной памяти компьютера (ПЗУ) можно только считывать информацию, а при работе с оперативной памятью (ОЗУ) информацию можно как записывать, так и считывать, то при работе с регистрами можно еще производить большое количество различных арифметических и логических операций над содержимым регистров.

Ячейки оперативной памяти одинаковы между собой и различаются только адресом. Регистры процессора своеобразны и имеют свои имена. Они обозначаются буквами латинского алфавита:

            F, A, B, C, D, E, H, L, SP, PC, IX, IY, I, R.

 

Это основной набор регистров. Есть еще один дополнительный набор, его называют альтернативным, его мы и рассмотрим ниже.

Некоторые из этих регистров - восьмиразрядные (однобайтные) и могут содержать целые числа от 0 до 255. Это регистры F, A, B, C, D, E, H, L, I, R.

Другие - шестнадцатиразрядные (двухбайтные). Они могут содержать целые числа от 0 до 65535. Это регистры SP, PC, IX, IY.

Некоторые однобайтные регистры могут объединяться в двух байтные регистровые пары BC, DE, HL. В этом случае о такой паре можно говорить как об отдельном шестнадцатиразрядном регистре.

Процессор Z-80 является весьма асимметричным процессором, т.е. каждый регистр обладает специфическими чертами, делающими его не похожим на остальные, и различные регистры предназначены для выполнения различных функций.

Рассмотрим регистры основного набора.

 

Регистр А - аккумулятор.

 

Этот регистр называют аккумулятором, т.к. во многих случаях результат исполнения операции остается в нем. В этом регистре выполняется наибольшее количество арифметических и логических команд. Это основной однобайтный регистр процессора. Во многих командах даже не указывается, к какому регистру они относятся: предполагается, что они относятся к регистру А.

 

Регистры B, C, D, E, H, Lрегистры общего назначения.

 

Эти регистры довольно широко используются процессором при выполнении различных команд. Их характерная особенность состоит в том, что они могут использоваться и как однобайтные одиночные регистры и как двухбайтные шестнадцатиразрядные регистровые пары: BC, DE, HL.

В этом случае наибольшее количество команд имеет регистр HL. При работе с двухбайтными целыми числами он имеет такое же важное значение, что и регистр А при работе с однобайтными.

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

К регистру DE подходит сокращение от слова destination («место назначения»). И действительно, во многих операциях, связанных с перемещением чего-либо куда-либо, регистр HL указывает, откуда взять, а регистр DE - куда отправить.

К регистру BC можно подобрать сокращение back counter («обратный счетчик»). В тех случаях, когда определенная последовательность команд должна повториться n раз, т.е. когда организуется цикл вычислений, в регистре BC хранится счетчик этого цикла.

При объединении одиночных регистров в пары, в первом хранится старший байт, а во втором - младший. Итак, B, D, H - старший, а C, E, L - младший. Для тех, кто немного знает английский язык, напоминанием будет название регистра HL. Сначала H - high («старший»), а затем L - low («младший»).

 

Регистр SPуказатель стека (stack pointer).

 

В тех случаях, когда необходимо на некоторое время освободить какой-либо регистр (или регистры) и запомнить его содержимое впредь до дальнейшего использования, компьютер может использовать в качестве  места временного хранения данных особый участок оперативной памяти, называемый машинным стеком. Обратите внимание на слово «машинный». Бывают и другие стеки, например, стек калькулятора или, скажем, пользовательский стек, который Вы создадите сами для своих собственных нужд, но об этом речь еще впереди, а пока поговорим о машинном стеке. Стек - это такая форма организации памяти, при которой загрузка и выгрузка данных выполняется по принципу LIFO (last in first out - «последним пришел - первым уйдешь»).

После включения компьютера в сеть, машинный стек в нем организуется автоматически. Его создают те процедуры, которые записаны в ПЗУ компьютера. Это и не удивительно, ведь он нужен им для работы, а работать им приходится очень много, хотя бы для того, чтобы компьютер сразу после включения уже мог понимать Ваши команды. Находится машинный стек в верхних областях памяти, выше адреса, установленного в системной переменной RAMTOP, чтобы написанная Вами БЕЙСИК-программа не затерла и не повредила его. Но если Вы работаете с машинным кодом, можно организовать стек и в другом месте оперативной памяти, причем почти в любом [прим.3].

Стек «растет» сверху вниз. Т.е. если вершина стека находится по адресу 60000, то следующее число, помещенное на стек, будет записано в ячейку 59999, а следующее за ним - в 59998. При этом перемещается и его вершина.

Вот здесь-то и нужен регистр SP. В нем всегда содержится адрес вершины стека. При помещении очередного числа на стек, регистр SP автоматически уменьшает свое значение, а при снятии числа со стека - увеличивает. Заслав свой адрес в указатель стека, Вы можете организовать стек в другом месте оперативной памяти.

В принципе, в качестве временного места хранения промежуточных результатов вычислений можно использовать обычные методы адресации типа LD (nn),A, но при хранении данных на стеке доступ к ним проще, понятнее, быстрее и экономичнее.

Еще одно назначение стека связано с использованием подпрограмм. Так, при изменении нормального порядка исполнения программы, (когда команды исполняются последовательно одна за другой) и при переходе на исполнение подпрограммы необходимо запомнить адрес возврата, чтобы потом продолжить вычисления с точки, находящейся после места вызова подпрограммы. Этот адрес (в виде двух байтов) и помещается на стек. По окончании исполнения подпрограммы по команде RET он снимается со стека и отправляется в программный счетчик PC, что и обеспечивает возврат.

Разумеется, если во время работы подпрограммы Вы что-то будете помещать на стек, то при возврате программа не найдет нужного адреса, т.к. изменится содержимое вершины стека. Значит, если при работе в подпрограмме Вам необходимо поместить сколько-то чисел на стек, то столько же надо оттуда снять до того, как встретится команда RET.

 

Регистр PCпрограммный счетчик (program counter).

 

Этот регистр - шестнадцатиразрядный. Он служит для хранения адреса той операции, которая должна выполняться следующей. Когда процессор начинает выполнять эту операцию, программный счетчик получает приращение на единицу, если команда однобайтная, на два - если двухбайтная и т.д. Таким образом, по окончании этой операции процессор знает, какую операцию выполнять следующей. Так выдерживается последовательное исполнение программы.

Если в программе имеется переход в иное место (аналогично GO TO БЕЙСИКа) или вызов подпрограммы (аналогично GO SUB БЕЙСИКа), то именно программный счетчик и обеспечивает такой скачок. В него засылается адрес, в который должен быть выполнен переход, и процессор теперь знает, откуда продолжать вычисления.

 

Регистр F регистр флагов.

 

Этот регистр отличается от всех. Его не рассматривают как отдельный регистр, хранящий восьмиразрядное число, а скорее, как восемь отдельных флагов - битов. Каждый флаг может быть установлен или снят, т.е. соответствующий бит, включен (равен 1) или выключен (равен 0). Ниже показана структура регистра флагов:

 

S

Z

-

H

-

P/V

N

C

7

6

5

4

3

2

1

0

 

Он содержит следующие флаги:

·         Бит 0 - флаг переноса С;

·         Бит 1 - флаг сложения/вычитания N;

·         Бит 2 – флаг переполнения/четности P/V

·         Бит 3 - не используется;

·         Бит 4 - флаг полупереноса H;

·         Бит 5 - не используется;

·         Бит 6 - флаг нуля Z;

·         Бит 7 - флаг знака S.

Флаги C, P/V, Z, S - активно используются в различных командах. Мы рассмотрим работу с этими флагами в разделе 5.9.5.

Флаги N и H программистом не используются. Они участвуют при выполнении операций с десятичными числами, выраженными двоичной формой. Об этом мы поговорим в следующей главе.

 

Регистры IX, IYиндексные регистры.

 

Это две регистровые пары, т.е. это шестнадцатиразрядные регистры. Используются они, как правило, для запоминания адресов. Характерной особенностью этих регистров является то, что с помощью них можно организовать так называемую индексную адресацию. Если Вам надо работать с какими-либо таблицами данных, то Вы можете при разыскании и выборке нужного Вам элемента таблицы (например, 55-го) не задавать его адрес, а хранить в индексном регистре адрес начала таблицы. Обращение к 55-ому элементу выполняется путем обращения к этому индексному регистру с указанием величины «смещения» нужного Вам элемента от начала таблицы, т.е. в данном случае числа 55.

В «Спектруме» относительно регистра IY есть неофициальное соглашение о том, что он содержит адрес 23610, который является адресом системной переменной ERR_NR (см. нашу разработку «Большие возможности вашего Спектрума»). Это позволяет легко обращаться к любой системной переменной. Первоначальную установку содержимого регистра IY на этот адрес выполняет после включения компьютера в сеть программа инициализации, находящаяся в ПЗУ, но Вы, конечно, можете изменить эту установку, заслав туда какой-либо свой адрес, если работаете в машинных кодах. Не забудьте восстановить исходное значение 23610, если Вы хотите, чтобы Ваша программа, исполнив машинный код, нормально вернулась в БЕЙСИК.

Регистр IX широко используется компьютером при исполнении команд загрузки/выгрузки программ: LOAD, SAVE, VERIFY, MERGE. В нем хранится адрес начала места загрузки (выгрузки) блока. Когда Вы выполняете загрузку/выгрузку из БЕЙСИКа, Вам об этом думать не надо. Процедуры, расположенные в ПЗУ, все за Вас сделают, но если Вы выполняете эти операции из программы в машинных кодах, то надо установить требуемое значение в этом индексном регистре.

 

Регистр Rрегистр регенерации.

 

Это внутренний системный регистр, который используется процессором автоматически, без участия программиста. Электрические заряды в микросхемах оперативной памяти имеют тенденцию «утекать», поэтому для нормальной работы компьютера необходимо производить подзарядку (регенерацию) оперативной памяти. В этих целях и используется регистр R.

 

Регистр Iвектор прерываний.

 

Для компьютеров иных систем, собранных на базе процессора Z-80, этот регистр используется для организации обмена с периферийными устройствами. В «Спектруме» эта возможность не используется, и этот регистр участвует только в формировании телевизионного сигнала.

 

Альтернативный набор регистров.

 

Одной из отличительных черт процессора Z-80 является наличие альтернативного набора регистров. Эти регистры F', A', B', C', D', E', H', L'. Они полностью идентичны регистрам F, A,  B, C, D, E, H, L.

Наличие такого альтернативного набора позволяет быстро переключаться с одного набора на другой. Когда нужно произвести какие-то операции с регистрами общего назначения, а они уже заняты и потерять содержащиеся в них данные нельзя, перед Вами есть три пути:

1.  Отправить содержимое в память, а потом вернуть его назад.

2.    Поместить содержимое на стек, а потом вернуть его оттуда.

3.    Переключиться на альтернативный набор регистров и работать с ним, а потом переключиться назад на основной набор.

Третий путь самый оперативный.

Благодаря наличию альтернативного набора процессор может одновременно обслуживать две задачи. В то время, когда Вы переключились на альтернативный набор, он становится основным, а бывший основным - становится альтернативным. Физически эти наборы совершенно идентичны и потому нет никаких программных средств, чтобы определить, с каким именно набором Вы в данный момент работаете. Программа может получиться слишком хитросплетенной и от программиста требуется определенная внимательность.

В «Спектруме» есть небольшая особенность по использованию альтернативных регистров. Она касается альтернативной пары H'L'. Дело в том, что для нормальной работы компьютера в БЕЙСИКе в этой паре должен стоять адрес 10070 (2756H в шестнадцатеричной системе). Поэтому при работе с альтернативным набором, если Вы рассчитываете впоследствии возвратиться в БЕЙСИК, Вам либо не надо трогать содержимое H'L', либо перед возвратом надо восстанавливать там число 10700. Если же Вы в БЕЙСИК возвращаться не собираетесь, делайте с этой парой все, что хотите.





СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Юмор - Записи в дневниках учеников.
От редакции
SOFTWARE - Трактат о великой пользительности некоторых авторский разработок.
Из книг - Море синеет: Джошуа Слокэм - первый кругосветный мореплаватель-одиночка.
Вестник - Страсти по ZX Next У западников очередное обострение войны копирайтов.

В этот день...   19 марта