Как ориентироваться в машинном языке 1969 г.

Заглянем в ЦП - регистры и адресация.


                    З А Г Л Я Н Е М  В  ЦП

                    В  В  Е  Д  Е  Н  И  Е

         Мы  говорили,  что  мозг  "Спектрум"  - ЦП процессор
Z80A.  Это  более  быстродействующий  вариант процессора Z80,
производимый   по   лицензии  фирмой  "ЗАЙЛОГ".  Единственное
отличие  между  процессорами  Z80  и  Z80A состоит в том, что
первый    процессор    работает    при   частоте   генератора
синхроимпульсов 2 МГц, а второй - 3,5 МГц. 
         Частота генератора синхроимпульсов - это просто мера
скорости  выполнения  вычислений  ЦП. В "Спектрум" за секунду
генерируется   3,5   миллиона   синхросигналов,   т.е.   один
синхроимпульс каждые 0,000000286 секунды. 
         Cамая  быстрая  команда,  выполняемая ЦП, занимает 4
синхроимпульса,  а  самая  долгая  -  21  синхроимпульс.  Это
означает,  что  даже  если  будут  выполняться  только  самые
медленные  команды,  все  равно  за секунду будет выполняться
около 160 000 команд. 

                    Физическая карта мозга

         Процессор   "Спектрум"   -   кремниевый   чип  с  40
контактами, пронумерованными от 1 до 40. Эти контакты - линии
связи  между процессором и остальной ЭВМ. Например, процессор
получает  питание  от  источника  питания  через  контакт 11,
получает синхроимпульсы через контакт 6, получает и принимает
адреса  через  контакты  с  1  по  5 и с 30 по 40, посылает и
принимает  данные через контакты с 7 по 15 за исключением 11.
Остальные   контакты   предназначены  для  передачи  сигналов
управления. 
         На этом этапе вам может показаться, что вы полностью
запутались. Но не стоит приходить в недоумение. На самом деле
наше  счастье в том, что мы не знаем внутренней структуры ЭВМ
и нам не нужно ее знать, чтобы пользоваться ее возможностями.
Здесь  то же самое, что с калькулятором. Физическая структура
ЭВМ  "прозрачна" для пользователя (иными словами, мы не видим
ее).  Нас интересует только логическая структура калькулятора
или,  в  данном случае, чипа Z80, и как мы можем использовать
его для наших целей. 

                   Логическая картина мозга

         Логически  Z80  можно  разделить на 5 функциональных
частей: 
      1. Устройство управления; 
      2. Регистр команд; 
      3. Счетчик команд; 
      4. Арифметико-логическое устройство; 
      5. 24 регистра пользователя (используемые руки и ноги
         ЦП). 

                    Устройство управления

         Мы  можем  рассматривать  устройство  управления как
некий  супервизор, управляющий работой ЦП. Его задача состоит
в  синхронизации  и координации ввода, обработки и вывода для
конкретного  задания, полученного ЦП вне зависимости от того,
исходят  ли  команды из ПЗУ с записанной в нем программой или
из вашей программы. 

                        Регистр команд

         Это  -  рука,  используемая  ЦП для хранения текущей
команды,  которую  он  собирается исполнять. Задание, в целом
составляющее  программу,  должно находиться гле-то в памяти -
либо  в  ПЗУ, либо в памяти с произвольным доступом. Вы может
быть  помните, что программа - это последовательность команд.
Так, чтобы выполнить задание, устройство управления должно по
очереди  отыскивать каждую команду в памяти (либо в ПЗУ, либо
в  памяти  с  произвольным  доступом) и перемещать ее в руку,
называемую "регистр команд". 

                        Счетчик команд

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

            Арифметико-логическое устройство (АЛУ)

         Это  калькулятор  внутри  ЦП. Он может выполнять как
арифмети- ческие, так и логические операции. Из всех основных
арифметических  функций, известных нам с вами, это устройство
может   выполнять   только   простые  сложение  и  вычитание,
увеличение  (добавление  1) и уменьшение (вычитание 1), но не
умножение  и  деление.  Это устройство может также сравнивать
числа  для одной руки и выполнять "побитовые" операции, такие
как  перемещение  пальцев  по  кругу,  выставление и прижатие
определенных пальцев и т.д. 
         Как  побочный  результат вычислений, поручаемых АЛУ,
обычно  меняется состояние различных "флагов" в регисте FLAG.
Ниже этот вопрос рассматривается более подробно. 

                   Регистры  пользователей

         Это руки и ноги ЦП, которыми вы, программист, можете
управлять.   В   микропроцессоре   Z80  имеются  24  регистра
пользователей.  Некоторые  из  них  будут руки, а некоторые -
ноги.   Образ,   созданный   нами   с   помощью  рук,  ног  и
прямоугольников,  позволяет  нам  легко зрительно представить
себе процессы и дает хорошее представление о происходящем, но
знатоки  программирования  будут в недоумении, если вы будете
говорить  что-то  вроде:"...и затем ЭВМ перемещает информацию
из правой руки в левую". 
         Теперь  мы  дадим  вам правильные названия для рук и
ног  ЦП,  так что столкнувшись с подобной ситуацией вы можете
сказать: 
                          "LD  B,A" 
         Во-первых,  знатоки программирования называют руки и
ноги ЦП РЕГИСТРАМИ. Выше мы говорили, что у ЦП имеется 8 рук:
они  называются  A,  B,  C,  D, E,... В построенном нами мире
рука, по определению, это нечто с 8 пальцами. 
         У  ЦП  есть  две  ноги:  они  называются IX и IY. По
определению нога - это все, что угодно с 16 пальцами. 
         Названия   рук  и  ног  легко  запомнить.  Поскольку
название  регистра состоит из одной буквы, то это должна быть
рука  (т.е.  он  содержит  8 битов). Тогда как, если название
состоит  из двух букв, то это будет нога (т.е. он содержит 16
битов). 
         Вы обратили внимание как легко мы перешли от пальцев
рук и ног к битам? Мы очень быстро приучим вас к терминологии
программирования. 
         На  самом  деле, остальные две руки ЦП, следующие за
D, E... назывются не "G" и "H", как можно было ожидать, а "H"
и "L". 
         Ниже  приводится  традиционный  способ представления
всех этих регистров: 
                   ЇЇЇЇЇЇЇЇЇЇЇЄЇЇЇЇЇЇЇЇЇЇЇ 
                        A     -     F
                        B     -     C
                        D     -     E
                        H     -     L
                              IX
                              IY

         Обратите  внимание,  что "F" соответствует "A", зато
порядок   остальных   достаточно  естественнен.  Причина,  по
которой  регистры сгруппированы таким образом, состоит в том,
что иногда можно из двух рук составить ногу. 
         В  конце  концов, если по определению нога - нечто с
16  битами, то возможно мы можем иногда использовать подделку
и  применять  две  8-битовые  руки  вместо  ноги.  Поэтому мы
говорим  о "парах регистров" таких, как BC, DE и HL. Причина,
по  которой  пара  регистров  "HL" называется так, а не "GN",
например,  состоит в том, чтобы помочь запоминать, в каком из
регистров  старшее  число,  а в каком младшее. Это аналогично
тому,  как если бы вы хотели представить числа от 0 до 100 на
руках   и   ногах.  Вы  легко  можете  составить  из  пальцев
представление чисел 0 и 10, и аналогично будет с пальцами ног
(при  условии,  что вы достаточно подвижны). Один из способов
обозначить  таким  методом число 37 - отложить 3 на руках и 7
на  ногах,  но  нужно  как-то договориться, какое число будет
старшим  разрядом,  а  какое младшим. Иначе кто-нибудь другой
решит, что вы хотели представить число 73. 
         "H"  в  "HL" означает старший (HIGHT), а "L" младший
(LOW), так что нет возможности перепутать. 
         Эта  схема  пар  регистров  позволяет также указать,
какой из регистров в двух парах содержит старшее число: 

                           B  C  BC
                           D  E  DE

поскольку   все   старшие   и  младшие  числа  размещаются  в
одинаковом порядке. 
         Ноги (IX и IY) также имеют специальное название: они
называются  индексными  регистрами.  Это  связано во многом с
тем,  что они применяются для организации информации так, как
организуют  указатель  в  книге.  С другой стороны, вы можете
рассматривать  их как указатели таблиц. Теперь все в порядке.
Вы  поняли  терминологию  и  можно  остановиться на некоторых
частных вопросах. 

              НАКАПЛИВАЮЩИЙ РЕГИСТР (РЕГИСТР А)

         Это  8-битовый регистр (однобайтовый) - самый важный
в  Z80.  Его название восходит к первым поколениям ЭВМ, когда
был   лишь   один   регистр,   применявшийся  для  накопления
результата.  И  хотя  мы ушли вперед от первых поколений ЭВМ,
накапливающий  регистр  по-прежнему  широко  применяется  для
логических  и  арифметических  операций. На самом деле многие
ЭВМ все еще конструируются таким образом, что многие операции
можно  выполнять только с помощью регистра А. Это имеет место
и  для  чипа  Z80  и регистр А - привилегированный. Вы можете
представлять  себе  регистр  А  как правую руку ЦП аналогично
тому, что многие люди некоторую работу легче выполняют правой
рукой, чем левой. 

                            ФЛАГИ

         Обратите,  пожалуйста , внимание, что "AF" обычно не
рассматривается   как  пара  регистров.  "F"  в  этом  случае
применяется  для  обозначения  "регистр флагов". Это рука с 8
пальцами,  так  что  каждый палец указывает выполнено или нет
определенное условие. Мы вернемся к этому вопросу в отдельной
главе. 

                        ПАРА РЕГИСТРОВ

         Из  трех  пар  регистров  (BC,  DE,  HL)  пара  HL ,
возможно,  наиболее  важная.  Помимо  того,  что пользователю
предоставлен  выбор,  применять  ли  ее в виде двух отдельных
регистров  или  как  пару регистров. Z80 сконструирован таким
образом,    что   есть   определенные   операции   16-битовой
арифметики,  которые  можно  выполнять  только с помощью пары
регистров HL. 
         Из-за  такого  привилегированного,  с  точки  зрения
аппаратуры,  положения,  операции  над  парой общих регистров
будут  обычно  быстрее  выполняться  для  регистров HL. Из-за
этого  HL  оказывается  предпочтение  в  программировании  на
машинном языке. 
                АЛЬТЕРНАТИВНЫЙ НАБОР РЕГИСТРОВ

         Я  решил, что именно здесь следует сказать, что у ЦП
есть  еще запасной набор рук. На самом деле не запасной набор
рук,  а запасной набор рабочих перчаток (альтернативный набор
регистров).  Это  все  равно,  как  если  бы  у вас был набор
жестких  пластмассовых  перчаток.  Даже  столь жестких, чтобы
сохранять  форму  вашей  руки,  когда  вы  их снимаете. Если,
например,  вы  отложили  на руке число 3 и сняли перчатки, то
перчатка  все  еще  будет  сохранять  форму руки с отложенным
числом 3. 
         Вы,  вне  всякого  сомнения,  сразу  сообразите, как
применить  такие  перчатки  -  вы можете запомнить число пока
носите  один набор перчаток, сменить перчатки, а старое число
останется  на  случай  необходимости  в  этом  другом  наборе
перчаток.  Другая  перчатка находится под рукой, если она вам
нужна,  и не забудет форму вашей руки, когда вы ее снимали. К
сожалению,  вы  не  можете  просто взглянуть и увидеть, какое
число  вы  там  сохранили.  Не  может,  естественно, перчатка
выполнять  какие бы то ни было вычисления, если внутри ее нет
руки.  Вам  придется  снова  сменить  перчатки,  чтобы  иметь
возможность  воспользоваться  всей  той  информацией, которую
хранят перчатки. 
         У  ЦП  есть  запасной набор перчаток для каждой пары
рук  (но  не для ног - где это видано, чтобы на ноги надевали
перчатки?),  но  их  нельзя переодевать с руки на руку также,
как  нельзя  на  левую  руку  надеть  перчатку с правой руки.
Поэтому  теперь  представление всех регистров принимает такой
вид: 

                  A  -  F  (===)  A'  -  F'
                  B  -  C  (===)  B'  -  C'
                  D  -  E  (===)  D'  -  E'
                  H  -  L  (===)  H'  -  L'
                              IX
                              IY

         Обратите  внимание,  что  набор перчаток, который вы
носите,  называется так же, как и соответствующая рука, тогда
как запасной набор всегда помечается штрихом. 
         Команды  по-прежнему  относятся  к  тому, что делают
руки, а не к тому, в какой они паре перчаток. Так что хотя мы
и  отмечаем  запасной  набор  штрихом,  не существует команд,
таких  как  LD  A',1.  ЦП  работает  с  вашими руками, а не с
перчатками.     Единственные     команды,    относящиеся    к
альтернативному  набору  регистров,  это команды типа "теперь
переоденьте перчатки". Например: 

  1. LD  A, (ящик N1)     : загрузить в А содержимое В ящика N1
  2. EX  AF, AF'          : сокращенная форма "заменить"
                          : (EXCHANGE) - т.е. заменить
  3. LD  A, (ящик N2)     : перчатки на AF перчатками AF'
  4. EX  AF, AF'          : еще одна замена
  5. LD  A, (ящик N3)     :

         Вы  заметьте, что среди 5 приведенных команд ни одна
не  оказывает конкретного воздействия на набор альтернативных
регистров.  Однако  мы  изменили  их  содержимое. Этот пример
сконструирован  для  того, чтобы служить иллюстрацией понятия
об  альтернативном  наборе регистров. Постарайтесь понять что
происходит. 
         Знаете,   что   будет  в  регистре  А  после  каждой
команды? Для простоты предположим, что содержимое трех ящиков
таково: 

                        (ящик N1) = 1
                        (ящик N2) = 2
                        (ящик N3) = 3

Так вот что происходит после каждой команды: 

              REGISTER  A         REGISTER  A'
         1.       1                NOT KNOWN
         2.   NOT KNOWN                1
         3.       2                    1
         4.       1                    2
         5.       3                    2

          REGISTER - регистр; NOT KNOWN -неизвестно.

         На самом деле очень просто. 
         Вы  обнаружите, что эти заменяющие регистры особенно
полезны, когда у вас кончаются руки (ноги), записывая то, что
на  них  отложено  в  стек  или  в память. Мы рассмотрим этот
вопрос позже. 

                        ЕЩЕ  РЕГИСТРЫ?

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

                       УКАЗАТЕЛЬ СТЕКА 

     Это  еще  одна  нога  ЦП (2-байтовый регистр адреса). Он
всегда указывает до какого размера вырос стек. С ростом стека
он  смещается  вниз к ячейкам памяти с меньшими номерами. Вам
обычно  не  приходится при программировании на машинном языке
делать  что-нибудь  с  указателем  стека.  За ним следит ЦП и
модифицирует  его  каждый  раз,  когда вы выполняете PUSH или
POP.   Обратите   внимание,  что  часто  встречается  ошибка,
состоящфя  в  том,  что  забывают  вытолкнуть назад значение,
которое  втолкнули  в  стек.  Вы можете быть уверены, что это
приведет к ситуации CRASH (сбой) в вашей программе. 

                          РЕГИСТР  I

         Это   регистр   вектора   прерывания.   В  системах,
основанных  на  Z80,  отличных  от  "Спектрум",  этот регистр
обычно  применяется  для  хранения  базового  адреса  таблицы
адресов   для  обработки  различных  реакций  на  прерывание,
например,  запросов  ввода-вывода.  Однако  в  "Спектрум" это
средство  не  применяется  и  регистр I участвует в генерации
сигналов  управления экраном. Вряд ли вам когда-либо придется
пользоваться этим регистром. 

                          РЕГИСТР  R

         Регистр  R - регистр восстановления памяти. В Z80 он
предназначен   для  автоматического  обновления  динамической
памяти. В процессе работы процессора Z80 информация, хранимая
в  тех  частях  динамической  памяти, к которым долго не было
доступа,   будет   "утекать"   из-за  падения  напряжения  со
временем. Если не обновлять (перезаряжать) эти ячейки памяти,
то  хранившаяся  певоначально  информация исчезает. Регистр R
служит  простым  счетчиком,  наращиваемым  каждый  раз, когда
происходит  цикл  поиска  информации в памяти. Таким образом,
значение  в  регистре R все время циклически меняется от 0 до
255.   Этот   факт   может   использоваться  аппаратурой  для
обеспечения   обновления   всех   частей   памяти.  Не  нужно
беспокоиться.  Вам  ничего  не  нужно  знать  об  этом.  Дело
господина  Синклера  позаботиться об этом при конструировании
"Спектрум". Мы можем просто пользоваться его ЭВМ, не думая об
обновлении   и   тому   подобных   вещах.   С   точки  зрения
программирования  вы  можете  считать  регистр  R относящимся
целиком  к аппаратуре и системным применениям. Однако, иногда
вы  можете пользоваться им как средством получения случайного
числа от 0 до 255. Это применение мы продемонстрируем ниже. 

                         В Ы В О Д Ы

                    РЕГИСТРЫ ПОЛЬЗОВАТЕЛЕЙ

         В  ЦП  есть 8 основных 8-битовых регистров (A, F, B,
C,  D,  E, H, L) и два 16-битовых регистра (IX, IY). названия
8-битовых регистров состоят из одной буквы, а 16-битовых - из
двух букв. 

                       ПАРЫ  РЕГИСТРОВ

         Шесть   из  восьми  8-битовых  регистров  могут  при
определенных условиях использоваться для обработки 16-битовых
чисел.  Это  -  пары регистров BC, DE и HL. Название HL может
напомнить нам какой байт старший, а какой младший. 

                  ПРЕДПОЧТИТЕЛЬНЫЕ  РЕГИСТРЫ

         ЦП  Z80  сконструирован таким образом, что некоторые
8-битовые  команды  могут выполняться с помощью регистра А, а
некоторые 16-битовые - только с помощью пары регистров HL. 

               АЛЬТЕРНАТИВНЫЙ  НАбОР РЕГИСТРОВ

         Восемь основных 8-битовыХ регистров можно сменить на
другой  альтернативный  набор регистров. Значения, хранимые в
основных   регистрах,   сохраняются   ЦП   пока  используется
альтернативный  набор,  но  к ним нельзя осуществлять доступ.
Повторная   смена   набора   регистров  позволяет  нам  вновь
обрабатывать первоначальные значения. 

      ВСЕ ЭТО ХОРОШО, НО КАК ЖЕ МНЕ ВЫПОЛНИТЬ ПРОГРАММУ
                     НА МАШИННОМ ЯЗЫКЕ ?

         Возможно   вы   уже   достаточно   узнали   о  ЦП  и
шестнадцатеричной системе счисления, и все это кажется вам не
имеющим  отношения  к делу. Все это не объясняет как на самом
деле выполнить программу на машинном языке. 
         "ZX  Спектрум"  на  самом  деле  все время выполняет
программы  на  машинном  языке.  Просто вы об этом не знаете.
Даже  когда  вы  ничего не делаете, просто смотрите на экран,
пытаясь  придумать, что ввести в качестве первой строки вашей
потрясающей   основы   программы   на   языке  "Бейсик",  ЭВМ
"Спектрум"   занята  работой  под  управлением  программы  на
машинном  языке.  Это  одна из программ, хранимых в ПЗУ, и ее
называют  операционной  системой.  Например, часть программы,
выполняющаяся  когда  вы  просто  сидите и смотрите на экран,
выполняет следующее: 
      - сканирует клавиатуру в поисках введеной информации; 
      - отмечает, что ни одна клавиша не нажата; 
      - выдает на дисплей текущий экран (пустой). 
         Даже   когда   вы   выполняете  программу  на  языке
"Бейсик", ЦП управляется программой на машинном языке. Как мы
уже    объясняли,    эта    программа    относится   к   типу
интерпретаторов:  она  берет  вашу  следующую  команду  языка
"Бейсик",  преобразует  ее  на  машинный  язык, выполняет эту
часть  программы  и  затем  возвращается  к  интер-  претации
следующей  команды.  Все  это  оказывается  не  так, когда вы
выполняете  свою  собственную  программу  на  машинном языке.
Полная  свобода  от  операционной системы. Применение функции
"USR"   передает  управление  ЦП  тем  командам,  которые  вы
поместили  по адресу USR, каковы бы они ни были. Чтобы там ни
оказалось,  он  будет  интерпретировать  это  как  допустимые
команды  машинного языка. Перспектива довольно пугающая. Ведь
при потере управления вы можете потерять все, что хранилось в
памяти.  Одна  ошибка,  один  неверный  символ и вам придется
выключать   "Спектрум"  и  вновь  начинать  сначала.  Нет  ни
сообщений  об  ошибках,  ни  синтаксической проверки неверных
предложений  -  так,  что  если  вы сделаете малейшую ошибку,
будут   потеряны  часы  работы,  затраченные  на  ввод  вашей
программы. 
         В  конце  этой  книги мы включили программу на языке
"Бейсик",   которая  позволит  вам  вводить  и  редактировать
программы  на  машинном  языке.  Введя  эту  программу  в ваш
"Спектрум",   запишите  ее  на  ленту,  поскольку  более  чем
вероятно,что вы однажды потеряете управление вашей программой
на   машинном   языке.   С   другой   стороны,   не   бойтесь
экспериментировать  - вы не сможете испортить ЭВМ какой бы то
ни  было  программой  на машинном языке, вводимой вами. Самое
худшее,  что  может произойти, вам придется выключить и вновь
включить ваш "Спектрум". 
         Сейчас  мы  вам для возбуждения аппетита дадим очень
простую  программу на машинном языке. Загрузите написанную на
языке  "Бейсик"  программу  "Редактор  машинного языка в коде
EZ",  помещенную в конце этой книги и выполните ее. Программа
запросит  у вас адрес загрузки. Это значит спросит у вас, где
бы  вы  хотели  разместить машинные команды. В этой программе
кода  EZ  вы  не можете применять адреса менее 31500, так что
давайте  выберем  32000.  Введите  число 32000, затем нажмите
. На экране теперь светится команда или строка 
                           (# # #):
Это  означает, что программа ждет, чтобы вы ввели команду или
новую строку текста машинной программы. 
         Давайте  введем "1", затем пробел, затем "C" и затем
"9".  Это  похоже  на  ввод  строки  языка "Бейсик" с номером
строки  1,  но  это  -  строка  машинного  языка.  Если все в
порядке,  то  нажмите  .  На экране теперь должны быть
показаны все введенные вами строки: 
                           1    C9 

             и внизу экрана - подсказка: 

                "КОМАНДА ИЛИ СТРОКА (# # #):"

         На  этом  этапе вы не хотите добавлять больше строк,
так что давайте вместо этого введем команду. 
         Введите   слово  "DUMP"  и  затем  нажмите  .
Действие  этой  команды  состоит  в  выдаче  текста  машинной
программы  в  виде  распечатки  по  указанному вами адресу, а
именно 32000. 
         Вас  можно  поздравить.  Вы только что ввели команду
программы  на  машинном  языке.  Вы можете проверить, что она
была  введена  правильно,  введя теперь команду "MEM" и затем
.  Эта  команда  позволяет  вам просмотреть содержимое
памяти.  И  она запросит у вас начальный адрес. Введите тогда
32000 и затем . 
         Вы увидите содержимое ячеек памяти с 32000 по 32087.
Во всех должно быть 00 за исключением 32000, в которой должно
быть  С9.  Затем нажмите клавишу "M", чтобы вернуться на этап
ввода   основной   команды.   Команда  "C9"  означает  RETURN
(возврат).  Все это несколько напоминает езду на велосипеде в
первый     раз.     Вы    действительно    хотите    получить
самостоятельность,  но  как  только немного проедете, хочется
вернуться  к  надежности  твердой  земли  под  ногами  (иными
словами, операционной системы). 
         Теперь  переходим к выполнению программы на машинном
языке.  Чтобы  выполнить  любую  программу на машинном языке,
записанную  вами  в  память,  введите  команду  RUN  и  затем
. 
         Что  происходит? Почему внизу экрана появилось число
32000?  Это  адрес,  использованный  вами  в  качестве адреса
загрузки  в  начале.  Не забывайте, что функция USR состоит в
выполнении  подпрограммы  на  машинном  языке, в частности из
этой  функции  вытекает,  что  значение  USR  при возврате из
программы  на машинном языке, помещенной вами в память, будет
равно  значению  пары  регистров  BC.  Ответ  на  этот  вопос
вытекает  из способа, которым операционная система "Спектрум"
обращается   с   функцией  URS.  Когда  операционная  система
встречает  функцию URS, она загружает указанный пользователем
адрес в пару регистров BC - в данном случае 32000. 

                  Значение URS, как в предложении 

                      LET A = USR 32000

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

                              08
                              С9

         Ввести   эту  короткую,  состоящую  из  двух  команд
программу, можно так: 
         ввести  строку  1,  затем пробел, затем 0, затем В и
затем, нажав . Аналогичным образом ввести строку 2 С9.
Распечатка   должна   показать   вам,  что  вы  ввели  строки
правильно.  Введите команду DUMP и затем команду RUN. На этот
раз результат равен 31999. Так получилось потому, что команда
08 - это DEC BC (сокращенное название для уменьшения значения
ВС на 1). 

                          УПРАЖНЕНИЕ

         Поэкспериментируйте  с  командами,  включающими  ВС,
найдя  такие  команды  в таблице в конце книги. Сможете ли вы
разобраться,  что  означают  сокращения?  Обратите  внимание,
чтобы последней строкой во всех ваших программах была С9. Это
команда  RETURN.  И если вы ее забудете, программа никогда не
совершит возврат. Если это с вами произойдет, не беспокойтесь
-   ваша  ЭВМ  не  испортится.  Просто  выключите  питание  и
загрузите все снова. 

                          УПРАЖНЕНИЕ

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

         КАК ЦП ПРИМЕНЯЕТ СВОИ КОНЕЧНОСТИ (РЕГИСТРЫ)

                           ВВЕДЕНИЕ

         Мы  видели,  что  ваш "ZX Спектрум" обладает ЦП с 24
руками  и  ногами.  Ключевым вопросом для программирования на
машинном языке для вашего "Спектрум" будет то, какие операции
допускаются  и насколько ЦП легко их выполнять. Вообразите на
мгновение, что вы и есть ЦП. Возможно, как большинство людей,
вы   правша  и  есть  действия,  которые  вы  более  уверенно
выполняете правой рукой, чем левой. Могут найтись также такие
действия,  которые  проще  выполнять одним способом, а другим
сложнее.  Например,  снять  что-нибудь  с высокой полки левой
ногой  и  переложить в правую руку сложнее, чем проделать это
правой  и  левой  руками.  То  же самое относится к машинному
языку  -  вы  можете  легко выполнять некоторые задания одним
способом.  Другим  способом  сделать  это окажется сложнее, а
третьим  -  вовсе невозможно. Ключ к успеху здесь - в знании,
какие комбинации действий допустимы. 
         Для ЦП эквивалентом вашей правой руки служит регистр
А.   Накапливающий  регистр,  рука,  возникшая  в  результате
генетического  родства  с  ранними  ЭВМ. С другой стороны, вы
можете  временно  хранить то, что было в правой руке, в любой
другой руке, ноге и наоборот. 
        Специалисты  в  области  ЭВМ называют это регистровой
адресацией.  Но  это просто официальное название для передачи
информации из одного регистра в другой. 
         Вот еще примеры: 

                           LD A, B
                           LD H, E
и так далее. 
         Обратите,   пожалуйста   ,   внимание,   что   LD  -
мнемоническое  обозначение (сокращение) LOAD и что при чтении
текста на языке ассемблера операнды переставляются, а запятая
читается как "в". Так, предложение 

                           LD A, B

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

              СПОСОБЫ ПРИМЕНЕНИЯ КОНЕЧНОСТЕЙ ЦП

         Одно  из  преимуществ  процессора  Z80  -  в большом
количестве  конечностей  и  возможных их комбинаций (способов
адресации).  Давайте  посмотрим,  какие комбинации предлагает
Z80: 
    - непосредственная адресация; 
    - регистровая адресация; 
    - косвенная регистровая адресация; 
    - расширенная адресация; 
    - индексная адресация. 
         Список   названий   впечатляет?   Не   беспокойтесь,
сохраняйте уверенность и мы постепенно пройдем их все одно за
другим. 
         Приведенный   список   не  покрывает  все  возможные
комбинации, а только те, которые относятся к числам для одной
руки.  Давайте поочередно рассмотрим каждое из этих возможных
видоизменений. 

                  НЕПОСРЕДСТВЕННАЯ АДРЕСАЦИЯ

                  Общая форма для нее имеет вид 

                           LD R, N

(или  иная  команда  -  мы  используем  LD  только в качестве
примера). 
         Мы   используем   сокращение   R   для   обозначения
произвольного  8-битового  регистра,  а  N  -  для 8-битового
числа. 
         Непосредственная адресация - это метод, использующий
только  одну  руку. Реальные данные входят составной частью в
команду.   Это  означает,  что  ЦП  может  выполнять  команду
непосредственно  после  ее получения. Ему не приходится вести
поиск дополнительной информации в памяти, чтобы выполнить эту
команду. 
         Например,  отложите  215  на  руке  А.  Я уверен, вы
знаете  достаточно  уже  о  мнемонике,  чтобы суметь написать
так: 

               LD A,215       или    LD A,0D7H

и  опять-таки  вы  можете  сделать  то  же  самое  с любым из
регистров  и  с  любыми  числами. Ниже показан формат команды
типа непосредственной адресации: 
         -  БАЙТ  1  код  команды  (говорящей ЭВМ, что это за
            команда) 
         - БАЙТ 2 N (значение реальных данных для команды). 
         Поскольку  под  реальные данные отводится один байт,
число,  которое  вы можете указать, ограничено диапазоном 0 -
255.  Если  вам  это  не понятно, вернитесь к главе о способе
счета для ЭВМ. 
         Обычно  мы  применяем непосредственную адресацию для
инициали- зации счетчиков и определения констант, необходимых
для  вычислений. Непосредственную адресацию легко применять в
программировании   на  машинном  языке.  Тем  не  менее,  это
наименее гибкий из всех методов передачи информации (способов
адресации), поскольку и регистр и данные фиксируются в момент
написания   программы.  Эквивалентное  предложение  на  языке
"Бейсик" выглядело бы так: 

                           LET A=5

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

                    РЕГИСТРОВАЯ АДРЕСАЦИЯ

         Мы уже кратко рассматривали этот способ. Общая форма
имеет вид: 

                           LD  R,R
                     (или другие команды)

         При  этом  методе участвуют только две руки. Короче,
это передача информации с одной руки на другую. 
         ЦП  допускает передачу информации между любыми двумя
руками,  за  исключением  руки  F  (которую  вообще  не стоит
считать  рукой. Это регистр FLAG и вообще не предназначен для
хранения чисел в обычном смысле этого слова). 
         Для  команд с регистровой адресацией требуется всего
один байт. 
         Команды  этого  типа  не только коротки (один байт),
они   также   и   быстрее  выполняются.  Требующееся  для  их
выполнения    время    составляет   4   импульса   генератора
синхросигналов или менее одной микросекунды для "Спектрум". 
         Для  написания программ на машинном языке существует
правило,  что  для  повышения эффективности программы в плане
затрат  времени  и  памяти  всегда,  когда  есть возможность,
следует  применять передачу информации с рук на руки (регистр
- регистр). 

               КОСВЕННАЯ РЕГИСТРОВАЯ АДРЕСАЦИЯ

                LD (RR), A   или   LD A, (RR)
                LD (HL), N

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

      Например:
              LD HL,SHAPE : загрузить начало базы данных
SHAPE в HL 
       LOAD   LD A,(HL)   : поиск данных 
              INC HL      : дать приращение указателю 
              ПРОДОЛЖАТЬ LOOP ПОКА НЕ КОНЧИТСЯ 

                    РАСШИРЕННАЯ  АДРЕСАЦИЯ

                LD A, (NN)    или    LD (NN),A

         Теперь  посмотрим,  как происходит обмен информацией
между  памятью  и  вашими  руками  и  ногами. При расширенной
адресации  команда программы предоставляет ЦП адрес, заданный
двумя  байтами. Если передача информации осуществляется в или
из   накапливающего  регистра,  то  она  повлияет  только  на
содержимое ячейки памяти, заданной двухбайтовым целым числом.
Если  же  передача  информации  осуществляется  в или из пары
регистров,  то она повлияет и на ячеку памяти, и на следующую
ячейку. 
         Команда такого типа имеет следующий формат: 

      БАЙТ 1    КОД ОПЕРАЦИИ
      БАЙТ 2    (ДОПУСТИМЫЙ ДОПОЛНИТЕЛЬНЫЙ КОД ОПЕРАЦИИ)
      БАЙТ 3    МЛАДШИЕ РАЗРЯДЫ 16-БИТОВОГО ЦЕЛОГО ЧИСЛА
      БАЙТ 4    СТАРШИЕ РАЗРЯДЫ ЭТОГО ЦЕЛОГО ЧИСЛА

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

         SHAPE  DB N,N,N,....   : БАЗА ДАННЫХ SHAPE
         .
         .
         LD A,(SHAPE)           : ЗАГРУЗИТЬ ПЕРВЫЙ БАЙТ В
                                  НАКАПЛИВАЮЩИЙ РЕГИСТР

                     ИНДЕКСНАЯ  АДРЕСАЦИЯ

           LD R,(IX,IY+Д)   или     LD (IX,IY+Д), R
                    (или другие команды) 

         В передаче информации такого типа участвует нога ЦП,
индексный   регистр  IX  или  IY.  ЦП  складывает  содержимое
индексного  регистра  с  адресом,  заданным  в команде, чтобы
найти  исполнительный  адрес.  Это  один из типов команд Z80,
имеющих  16-битовый  код операций. Другой, широко применяемый
16-битовый тип команды - команда загрузки блока, например: 

               LDIR (LOAD INCREMENT AND REPEAT)
          - загрузить, дать приращение и повторить.

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

         LD IX,TABLESTART   : инициализировать указатель 
                            : на начало таблицы 
         LD A,(IX+3)        : обратиться к третьему байту 
                            : от начала таблицы

         Команда этого типа имеет следующий формат: 

         БАЙТ 1     (КОД ОПЕРАЦИИ)
         БАЙТ 2     (КОД ОПЕРАЦИИ)
         БАЙТ 3     D     : целочисленное значение смещения

Число D - 8-битовое число, которое необходимо задавать вместе
с  командой.  Оно не может быть переменным. Это означает, что
диапазон  адресации  ограничен  значениями  от  -128 до +127,
считая от адреса, заданного индексным регистром. 
         Индексная адресация выполняется медленнее, поскольку
ЦП  для  получения  исполнительного  адреса  должен выполнить
сложение.  И  все-таки  индексная  адресация  гораздо  гибче,
поскольку с помощью одной и той же команды можно обрабатывать
все элементы массива или таблицы. 

                         В Ы В О Д Ы

         Есть  много  способов  для  ЦП вести поиск 8-битовых
порций  информации  и  передачи  ее  из 8-битовых регистров в
память. 
         НЕПОСРЕДСТВЕННАЯ АДРЕСАЦИЯ задает в программе число,
передаваемое в любой регистр. 
         РЕГИСТРОВАЯ  АДРЕСАЦИЯ  - из любого регистра в любой
другой регистр. 
         КОСВЕННАЯ  РЕГИСТРОВАЯ АДРЕСАЦИЯ - либо используется
BC или DE для задания адреса, А. 
         А - для хранения передаваемого числа. 
         Либо  же HL для задания адреса и определения числа в
программе. 
         РАСШИРЕННАЯ  АДРЕСАЦИЯ - адрес задается в программе,
а А содержит 8-битовое число. 
         ИНДЕКСНАЯ  АДРЕСАЦИЯ  -IX  или  IY  используются для
задания  начала таблицы в памяти, а в любом регистре хранится
8-битовое  число.  Смещение  от  начала  таблицы  должно быть
задано в программе. 
         Передаваемое   в   память   число  также,  в  случае
необходимости, может быть задано в программе. 
         Эти  способы адресации единственные способы передачи
информации  в  память  и из нее. Никакие другие комбинации не
допускаются. 

                           Таблица
           Команды операций загрузки для одной руки

     MNEMONIC          SYTES    TIME     EFFECT ON FLAGE
                                TAKEN    C  Z  PV  S  N  H

 LD REGISTER,REGISTER     1       4      -  -  -   -  -  -
 LD REGISTER,NUMBER       2       7      -  -  -   -  -  -

 LD A, (ADDRESS)          3      13      -  -  -   -  -  -
 LD (ADDRESS), A          3      13      -  -  -   -  -  -

 LD REGISTER,(HL)         1       7      -  -  -   -  -  -
 LD A,(BC)                1       7      -  -  -   -  -  -
 LD A,(DC)                1       7      -  -  -   -  -  -
 LD (HL),REGISTER         1       7      -  -  -   -  -  -
 LD (BC),A                1       7      -  -  -   -  -  -
 LD (DE),A                1       7      -  -  -   -  -  -

 LD REGISTER,(IX+Д)       3      19      -  -  -   -  -  -
 LD REGISTER,(IY+Д)       3      19      -  -  -   -  -  -
 LD (IX+Д),REGISTER       3      19      -  -  -   -  -  -
 LD (IY+Д),REGISTER       3      19      -  -  -   -  -  -

 LD (HL),NUMBER           2      10      -  -  -   -  -  -
 LD (IX+Д),NUMBER         4      19      -  -  -   -  -  -
 LD (IY+Д),NUMBER         4      19      -  -  -   -  -  -

MNEMONIC  -  мнемоническое  обозначение;  BYTES  - количество
байтов; 
TIME TAKEN - затрачиваемое время; EFFECT ON FLAGE - состояние
флагов после выполнения; REGISTER -регистр; NUMBER - число; 
ADDRESS - адрес. 

                   Обозначения для флагов: 
#  -  указывает, что флаг меняется в результате операции; 
0  -  указывает,  что  флаг  сброшен; 
1  -  указывает, что флаг установлен; 
-  -  указывает, что флаг остается неизменным. 



СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Ликбез - полный дизассемблер ПЗУ (часть 33).
Scene on the Web - Обзор сценовых порталов.
Joke - Семерка лучших origin'ов-мудрых и не очень выражений.
Почта - Процедура пропорциональной печати.
Приколись - хуйня какая-то.

В этот день...   26 апреля