Ассемблер
Как ориентироваться в машинном языке,
В ЭВМ "синклер" выбран ЦП типа Z80A, представлякхций собой более быстродействующий ва-
риант популярного типа 280. 4 Чипа. Z80, 6502, 6809 и 8088, стали широко распространенны-
ми в качестве ЦП для микро-ЭВМ. Z80 - самьм популярна из них.
Чип Z80 сконструирован таким образом, что он может принимать сигналы одновременно с
восьми подсоединенных к нему контактов.
Помня о том, что на самом деле есть только электрическиеш сигналы, давайте примем
систему условных обозначений этих сигналов - например, ставя Г, если на одном из кон-
тактов есть сигнал, и "0", если сигнала нет.
Типичная команда могла бы тогда выглядеть так:
0 0 1 1 1 1 0 0 это существенно отличается от "LET а = а + 1". Тем не менее, именно это и
есть машинный язьк.
Преимущества машинных язьков:
более быстрое выполнение программы;
более эффективное использование памяти;
более короткие программы (в памяти);
независимость от операционной системы.
Все перечисленные выше преимущества - непосредственное следствие- программирования на
язьке, которьи ЦП воспринимает без предварительной трансляции. Когда вы программируете на
"бейсике", то на самом деле ЭВМ выполняет программу операционной системы, написанную на
машинном язьке. Эта программа выглядит примерно так:
NEXT Взять следующую команду
перевести ее в последовательность команд машинного
языка
выполнить каждую команду
записать результат, если это нужно
снова перейти на NEXT
Если вас интересует, где ЭВМ берет эту программуа операционную систему, то она хра-
нится в ПЗУ. Иньми словами, она встроена в "спектрум . (ПЗУ - сокращенное название посто-
янного запоминающего устройства машинной памяти, ячейки которой вы не можете менять, а
можете только читать (REED/ PEEKED).
Программа на язьке "бейсик" может выполняться почти в 60 раз медленнее, чем программа,
написанная непосредственно на машинном язьке.
Причина этого - в том, что трансляция отнимает время, а также получающиеся в результа-
те команды машинного языка менее эффективны.
Тем не менее нам приходится пеовьми признать, что у программирования на машинном языке
есть свои недостатки:
программы трудно читать и отлаживать;
их невозможно перенести на другие ЭВМ;
программы оказываются длиннее (в командах);
трудно выполнять арифметические вычисления.
Это означает, что вам следует очень продуманно принимать решение о том, какой метод
программирования следует использовать для каждой конкретной задачи.
Что такое язык ассемблера?
Совершенно очевидно, что если бы машинньи язык можно было представлять только с по-
мощью чисел, "-ень ^чогие люди ^ыли бы способны писать программы на машинном язьке.
В конце концов, смог 5ы понять смысл программы, имещии следующий вид
0 0 10 0 0 01
00000000
0 10 0 0 0 0 0
И т. д.
К счастью, мы можем придумать ряд имен для каждого из этих чисел. Язьк ассемблера как
раз и является таким представлением машинного языка, так что люди могут читать его в бо-
лее понятной форме, чем
0 1110 111
Между язьком ассемблера и машинньм язьком есть только одно различие: язьк ассемблера
на один уровень выше, чем машинный язьк. Его легче читать человеку, чем мапинный язьк, но
с другой стороны, ЗВМ не может читать язьк ассемблера.
Он не является адаптацией машинного язька, подобно 'бейсику*. Для каждой команда язька
ассемблера имеется идентичная (по функции) команда машинного язька и наоборот. Иньми сло-
вами между ними имеется взаимно однозначное соответствие. Поэтому можно сказать, что язьк
ассемблера эквивалентен машинному языку.
Язьк ассемблера может быть преобразован непосредственно в машинную программу с помощью
программы или вами самими. Такая программа называется "ассемблером*. Вы можете рассматри-
вать ее как программу, выполняющую довольно утомительную задачу трансляции вавеи написан-
ной на я^ьке ассемблера программы в последовательность команд мавинного язька, понятных
'спектрум и мы считаем, что ассемблер" для "ZX спектрум" уже имеется.
Тем не менее, такие ассемблеры обычно требуют 6к памяти и имеют ограниченное примене-
ние на ЗВМ с объемом памяти 16к. Дисплей "спектрум" отнимает 7к памяти, и после загрузки
ассемблера у вас может остаться всего 4к памяти для программы на яз. Ассемблера.
Альтернативный способ работы - вместо применения программы ассемблера самому трансли-
ровать мнемонику язька ассемблера - машинньй язьк вручную, применяя приведенные в этой
книге таблицы.
Зто трудно, неудобно, но это прекрасная практика и дает вам глубокое понимание того,
как работает ЦП "спектрум".
В ZX SPECTRUM принята 16-ричная система счисления по следующим причинам:
1. Из этой формы числа легко перевести в двоичньй формат, который говорит нам, что оз-
начает каждьй бит (или палец).
2. Он дает нам возможность легко определить, будет ли число восьмиразрядное или вест-
надцатиразрядное.
о. Он дает стандартное представление всех чисел в виде последовательности двухразряд-
ных чисел.
4. Зто общепринятая система обозначений и знакомство с вестнадцатеричной системой поз-
волит вам с большей легкостью читать другие книги и руководства.
5. Поскольку ЦП сконструирован для обработки информации, представленной двоичньми
числами, которые людям для чтения неудобны, требуется более удобочитаемое представление.
Шестнадцатеричная система, как отмечалось вьше, позволяет представлять числа от 0 до
15 с помощью всего 4 битов. Любая 8-разрядаая ячейка памяти или 8-разрядный регистр может
поэтому быть описана как два набора по 4 бита.
Нас интересуют 8-разрядные ячейки памяти и 8-разрядные регистры потому, что такова
структура а спектрум". Все ячейки памяти и все одинарные регистры имейт по 8 разрядов.
Следующая программа на языке "бейсик" позволит вам ввести в ваш "спектрум" десятичное
число и преобразовать его в иестнадцатеричное значение.
1 0 0 REM DECIMAL то HEXADECIMAL CONVERSION
1 1 0 PRINT "PLEASE INPUT DECIMAL VALUE"
1 2 0 INPUT N: PRINT N
13 0 LET S$ -""": LET N2 = INT (N/16)
14 0 LET N1 - INT (N -N2*16
15 0 LET S$ - CHRJ ( (Nl<=9) * (N1+48) + (Nl>9) * (55+N1)) +S$
16 0 IF N2 = 0 THEN PRINT: PRINT "HEXADECIMAL - 0": S$
: V: FOR I = 1 то 200: NEXT I: RUN
17 0 LET N = N2: GO то 140
1 - преобразование десятичных в шестнадцатеричные: 2 - введите пожалуйста, десятичное
значение* S - знак заменен на знак - $
Попробуйте преобразовать в шестнадцатеричную систему следующие числа и с помощью прог-
раммы на язьке бейсик" проверьте свои ответ.
1. 16484 Адрес начала дисплейного файла "спектрум":
2. 22528 Адрес начала файла атрибутов "спектрум :
3. 15360 Адрес начала набора литер "спектрум :
4. 15616 Адрес начала литер в коде ASCII "спектрум".
Как прсАставАястся информация
В представлении информации человеком и ЭВМ имеется существенная разница. У-человека
информация в основном состоит из чисел и литер (алфавитно-цифровая информация), тогда как
вся информация в ЭВМ хранится в виде групп битов.
Бит означает двоичный разряд (6INARI DIG JT. "0" Или "1")^ в микропоцессоре Z80A зти
биты сгруппированы по 8. Группа в из восьми битов называется байтом .
Такой способ представления информации с помощью двоичных разрядов называется "двоичным
|>о|)матом Такова структура языка, на котором разговаривает Z80 и большинство ЦП микро-
В основном имеется два типа информации, представляемой внутри "спектрум". Первый - зто ,
программа, второй - данные, над которыми программа будет действовать и которые могут
включать числа или алфавитно-цифровом текст. Мы так и будем ниже рассматривать зти три
представления: программа, числа, алфавитно-цифровой текст.
Представление программы: программа - последовательность команд ЦП выполнить конкретное
задание, которое можно разбить на некоторое число "подразделений .
В 280 все команды имеют внутреннее представление в виде одного или нескольких байтов.
Команды, представленные одним байтом, называются "короткими командами". Более длинные ко-
манды представляются двумя или несколькими байтами.
Поскольку Z80 - восьмиразрядный микропрцессор, он может за один раз обрабатывать толь-
ко один байт, и если ему требуется более одного, он ведет последовательный поиск байтов в
памяти. Поэтому в общем случае однобайтовая команда будет выполняться быстрее, чем двух-
или трехбайтовая. Таким образом, как правило вьгодно писать программу на машинном языке,
применяя, где можно, однобайтовые команды.
Вы можете посмотреть "короткие и длинные" команды в таблице кодов команд в приложении.
Пусть вас не беспокоит, что они непонятны, позже мы рассмотрим каждую команду более глу-
боко.
Числа
Каждая ячейка памяти может использоваться либо для хранения положительных целых чисел,
либо целых чисел со знаком (чисел, которые могут быть и положительными и отрицательными)
по вашему выбору. Диапазон чисел может быть либо от 0 до 255 либо от -128 до +127.
Отрицательные числа
Было принято соглашение, что когда мы решаем, что в памяти будет храниться число со
знаком (+ или -), применяется следующее правило:
если бит 7 установлен, то число отрицательно
если бит 7 не установлен, число положительно. Чтобы получить число, противоположное
любому заданному числу, нужно взять "дополнение до двух" и прибавить 1.
Дополнение до 2
Дополнение любого числа до двух - это его отрицание в двоичном формате. Любой установ-
ленньй бит сбрасывается и наоборот.
Центральный процессор
№ говорили, что мозг "спектрум" -ЦП. Процессор Z80A. Это - более быстродействующий
вариант процессора Z80, производим^ по лицензии фирмой "зайлог".
Единственное отличие между процессорами Z80 и Z80A состоит в том, что первый процессор
работает при частоте генератора синхроимпульсов 2 МГц (мегагерц), а второй - 3, 5 МГц 4
частота генератора синхроимпульсов" - это просто мера скорости.выполнения ЦП вычислений.
В "спектрум" за секунду генерируется 3, 5 миллиона синхросигналов, т.е. Один синхроим-
пульс каждые 0,000080286 секунды.
Самая быстрая команда, выполняемая ЦП, занимает 4 синхроимпульса, а самая долгая - 21
синхроимульс. Это означает, что даже, если будут выполняться только самые медленные ко-
манды, все равно за секунду будет выполняться около 160 000 команд!
Физическая карта ЦП
Процессор "спектрум" - кремниевый чип с 40 контактами, пронумерованными от 1 до 40.
Зти контакты - линии связи между процессором и остальной ЭВМ. Например, процессор получа-
ет питание от источника питания через контакт П., получает синхроимпульсы через контакт
6, получает и принимает адреса через контакты с 1 по 5 и с 30 по 40 и посылает и принима-
ет данные через контакты с 7 по 15 за исключением И. Остальные контакты предназначены
для передачи сигналов управления.
Логическая картина ЦП
Логически Z80 можно разделить на пять функциональных частей. Это:
1. Устройство управления
2. Регистр команд.
3. Счетчик команд
4. Арифметико-логическое устройство.
5. 24 Регистра пользователя.
Устройство управления
№ можем рассматривать устройство управления как некий супервизор, управляющий работой
ЦП. Его задача состоит в синхронизации и координации ввода, обработки и вывода для конк-
ретного задания, полученного ЦП вне зависимости от того, исходят ли команды из ПЗУ с за-
писанной в нем программой или из вашей программы.
Регистр команд
Зто - регистр, используемый ЦП для хранения текущей команды, которую он собирается
исполнять. Задание в целом, составляющее программу, должно находиться где-то в памяти -
либо в ПЗУ, либо в памяти с произвольным доступом. Программа - зто последовательность ко-
манд. Так, чтобы выполнить задание, устройство управления должно по очереди отыскивать
каждую команду в памяти (либо в ПЗУ, либо в памяти с произвольным доступом) и помещать ее
в регистр команд.
Счетчик команд
Сообщает ЦП, где находится следующая часть программы ( адрес следующей ячейки памяти,
в которой устройство управления должно найти команду). Он подобен управдому для команд,
следящему за расположением следующей команды.
Арифметико-логическое устройство (ААУ)
Зто - калькулятор внутри ЦП. Он может выполнять как арифметические, так и.логические
операции. Из всех основных арифметических функций, известных нам с вами, зто устройство
может выполнять только простые сложение и вычитание, увеличение (добавление 1) и уменьше-
ние (вычитание 1), но не умножение и деление. Это устройство может также сравнивать числа
для одного регистра и выполнять "побитовые" операции, такие как перемещение битов по кру-
гу, выставление и прижатие определеннее битов и т. д.
Как побочньй результат вычислений, поручаемых АЛУ, обычно меняется состояние раэдщНР
"флагов" в регистре FLAG. Ниже зтот вопрос рассматривается более подробно.
Ниже приводится традиционно способ представления регистров пользователя:
Обратите внимание, что "F" соответствует "а", зато порядок остальных достаточно
естественен. Причина, по которой регистры сгруппированы таким образом', состоит в том, что
иногда можно из двух регитров составить пару.
IX и П также имеют специальное название: они называются "индексными регистрами".
Накапливавши регистр (регистр А)
Зто 8-битовый регистр (однобайтовьй) - самьй важный в Z8B. Его название восходит к
первьм поколениям ЗВМ. Когда был лишь один регистр, применявшийся для "накопления" ре-
зультата.
И хотя мы ушли вперед от первых поколений ЗВМ, накапливающий регистр по-прежнему широ-
ко применяется для логических и арифметических операций. На самом деле многие ЗВМ все еще
конструируются таким образом, что многие операции можно выполнять только с помощью ре-
гистра А.
Зто имеет место и для чипа Z80, и регистр а - привилегированна^.
Пара регистров
Из трех пар регистров (ВС, DE, HL) пара HL, возможно, - наиболее важная. Помимо того,
что пользователю предоставлен выбор, применять ли ее в виде двух отдельных регистров или
как пару регистров, Z80 сконструирован таким образом, что есть определенные операции
16-битовой арифметики, которые можно выполнять только с помощью пары регистров HL.
Из-за такого привилегированного, с точки зрения аппаратуры положения, операции над па-
рой общих регистров будут обычно быстрее выполняться для регистров HL. Из-за этого HL
оказывается предпочтение в программировании на машинном язьке.
Альтернативна набор регистров
представление всех регг^ров им®вт вид:
а - F (===) а" - F"
в - с (===) в' - с"
D - е (=«} D" - е"
н - L (■« н" - L"
IX
IY
Значения, хранимые в основных регистрах, сохраняются ЦП, пока используется альтерна-
тивный набор регистров, но к ним нельзя осуществить доступ.
Еще регистры
"Указатель стека" - (2-байтовьй регистр адреса/.
Он всегда указывает, до какого размера вырос стек. С ростом стека ом смещается вниз к
ячейкам памяти с меньшими номерами.
Вам обычно не приходится при программировании на машинном языке делать что-нибудь с
указателем стека. За ним следит ЦП и модифицирует его каждый раз, когда вы выполняете
PUSH или POP.
Обратите внимание, что часто встречается ошибка, состоящая в том, что забывают вытолк-
нуть назад значение, которое втолкнули в стек. Можете быть уверены, что зто приведет к
ситуации CRASH" (сбой) в вашей программе.
Регистр I
Зто - регистр вектора прерывания. В системах, основанных на Z80, отличных от "спект-
рум" этот регистр обычно применяется для хранения базового адреса таблицы адресов для об-
работки различных реакций на прерывание, например, запросов ввода-вывода.
Однако, в "спектрум это средство не применяется, и регистр I участвует в генерации
сигналов управления экраном. Вряд ли вам когда-либо придется пользоваться этим регистром.
Регистр R
Регистр R - регистр восстановления памяти. В Z80 он предназначен для автоматического
обновления динамической памяти. В процессе работы процессора Z80 информация, хранимая в
тех частях динамической памяти, к которым долго не было доступа, будет "утекать" из-за
падения напряжения со временем. Если не обновлять (перезаряжать) эти ячейки памяти, то
хранившаяся певоначально информация исчезает!
Регистр R служит простымшсчетчиком, наращиваемым каждый раз, когда происходит "цикл
поиска информации в памяти". Таким образом, значение в регистре R все время циклически
меняется от 0 до 255.
Зтот факт может использоваться аппаратурой для обеспечения "обновления" всех частей
памяти. Не нужно беспокоиться, вам ничего не нужно знать об этом. Дело господина синклера
позаботиться об этом при конструировании "спектрум". Мы можем просто пользоваться его
ЗВМ. не думая об обновлении и тому подобных вещах.
С точки зрения программирования вы можете считать регистр R относящимся целиком к ап-
паратуре и системным применениям. Однако иногда вы можете пользоваться им как средством
получения случайного-числа от 0 до 255. Зто применение мы продемонстрируем ниже.