Faultless #04
09 октября 1996

  ╔══════════════════════════════════════╗
  ║Раздел:CPU для вас;                   ║
  ║Статья:Начинать надо с малого;        ║
  ║Музыка:CONT;                          ║
  ║Текст :В.Александр,Б.Станислав.       ║
  ╚══════════════════════════════════════╝

   При всех  достоинствах  BASIC'а сущест-
  венный недостаток  этого языка - сравни-
  тельно невысокое быстродействие написан-
  ных на  нем  программ.Современные версии
  BASIC'а позволяют в ряде случаев компен-
  сировать этот недостаток, введя в основ-
  ную программу подпрограммы, записанные в
  машинных кодах.Особенно  удобно  пользо-
  ваться такими подпрограммами  при  обра-
  ботке больших массивов однородной инфор-
  мации.
   В компьютерных играх,в различных  прик-
  ладных  и  демонстрационных   программах
  весьма продуктивен   способ  копирования
  данных из одной области памяти в другую,
  например из экранной  области в зарезер-
  вированный участок памяти  и обратно.Это
  позволяет: практически  мнгновенно вызы-
  вать в нужную  часть  экрана рисунок или
  текст , заблаговременно помещенные в ре-
  зервную память;создавать движущиеся кар-
  тинки,поочередно "перерисовывая" изобра-
  жение или  его  часть из "экрана" в "ко-
  пию" и обратно и меняя  при этом опреде-
  ленные параметры;достигать других эффек-
  тов.
   На SPECTRUM'е существует  такая команда
  мп  LDIR, которая пересылает блок памя-
  ти,адрес которого  указан в регистре HL,
  длина - в BC,а адрес,в который необходи-
  мо  переместить  блок.При  каждом  такте
  операции  число , занесенное в пару  BC,
  уменьшается на 1,а соответствующие адре-
  са в HL и DE на 1 увеличиваются.
   Адреса  соседних  ячеек видеопамяти,со-
  держимое которых отображается на дисплее
  в виде элементарных  участков растра,от-
  личаются как  раз на единицу.Понятно,что
  таким образом можно скопировать весь эк-
  ран или его  отдельную  часть.Очевидно и
  другое: если  команду блочной  пересылки
  применять в пределах одной строки,занеся
  в BC длину ее  отрезка,затем загружать в
  HL начальные адреса последующих отрезков
  и повторять  операцию блочной пересылки,
  то можно  скопировать  в резервный буфер
  любой участок экрана.

     ВОЗМОЖНЫЕ ПОДПРОГРАММЫ ПЕРЕСЫЛКИ:

         Из экрана    Из копии
         в копию      в экран

         LD DE,(Z2)   LD DE,(Z1)
         LD BC,(Z3)   LD BC,(Z3)
         LDIR         LDIR
         LD BC,LENGHT LD BC,LENGHT
         ADD HL,BC    EX DE,HL
         LD A,(Z5)    ADD HL,BC
         DEC A        EX DE,HL
         LD (Z5),A    LD A,(Z5)
         JR NZ,$-20   DEC A
         RET          LD (Z5),A
                      JR NZ,$-22
                      RET

   В определенные  ячейки  памяти вписыва-
  ются:в первую пару , с начальным адресом
  Z1,- адрес начала копируемого фрагмента;
  во вторую,с начальным адресом Z2,- адрес
  "копии",т.е. участка памяти,зарезервиро-
  ванного   под  копию  этого  фрагмента;в
  третью, с адресом Z3,- длина копируемого
  отрезка строки,в LENGHT,- приращение те-
  кущего  адреса;и, наконец, в   отдельную
  ячейку,с адресом Z5, - количество строк.
   В результате пересылки в буферный учас-
  ток памяти отрезки строк  "укладываются"
  друг за другом без  каких-либо пробелов.
  Это  позволяет  существенно   сэкономить
  оперативную память компьютера.
   В заключении несколько слов о  ее быст-
  родействии.Легко подсчитать, что при ко-
  пировании всего экрана количество выпол-
  ненных   команд  превышает 100 тысяч.При
  тактовой частоте  3.47 - 3.51 Мгц и дли-
  тельности элементарных операций 4-6 так-
  та время копирования  экрана не превысит
  0.2 сек.Если же  пересылается  небольшой
  блок экрана,счет  идет на сотые секунды.
   Подпрограмма  для Z-80 копирует экран в
  буквальном смысле слова мнгновенно.

   Вы можете  даже  не знать,что такое ма-
  шинный язык.Вам  может  быть  даже неиз-
  вестно,что есть разница  между  машинным
  языком и языком ассемблера,и чем они оба
  отличаются от программирования  на языке
  BASIC.
   Не беспокойтесь и не пугайтесь  профес-
  сионального жаргона.В дальнейшем мы  все
  постепенно объясним.

   ЧТО ТАКОЕ МАШИННЫЙ ЯЗЫК ?

  Помня о том,что на самом деле есть элек-
  трические сигналы,давайте примем систему
  условных обозначений этих сигналов- нап-
  ример,ставя "1",если на одном из контак-
  тов есть сигнал,и "0",если сигнала  нет.
   Типичная команда  могла бы тогда выгля-
  деть так:

   00111100

   Это существенно отличается от
  "LET A = A + 1",не так ли!

   Тем не менее,именно это и есть машинный
  язык.Название говорит само за себя! Это-
  язык для машин.
   Здесь вы можете задать себе вопрос,если
  это и есть машинный язык,то в  чем проб-
  лема? Почему не воспользоваться продела-
  нной кем-то другим работой, что позволит
  мне программировать на ЭВМ на  языке,ко-
  торый я легко  понимаю , таком как BASIC
  или PASCAL.
   В этом есть  определенный  смысл  из-за
  следующих преимуществ машинного языка:
   Более быстрое выполнение программы;
   Более эффективное использование памяти;
   Более короткие программы (в памяти);
   Независимость от операционной системы.

   Все перечисленные  выше  преимущества -
  непосредственное  следствие программиро-
  вания на  языке, который ЦП воспринимает
  без  предварительной трансляции.Когда вы
  программируете  на "Бейсике",то на самом
  деле ЭВМ выполняет  программу операцион-
  ной системы, написанной на машинном язы-
  ке.
   Программа на  BASIC  может  выполняться
  почти в 60 раз медленнее,чем  программа,
  написанная непосредственно  на  машинном
  языке!!!
   Причина этого - в том , что  трансляция
  отнимает  время , а также получающиеся в
  результате  команды  машинного языка ме-
  нее эффективны.У  машинного  языка  есть
  следующие надостатки:
   Программы трудно читать и отлаживать;
   Их невозможно перенести на другие ЭВМ;
   Программы оказываются длиннее (в коман-
  дах);
   Трудно выполнять арифметические  вычис-
  ления.
   Это означает,что вам следует очень про-
  думанно принимать решение  о  том, какой
  метод программирования следует использо-
  вать для каждой конкретной задачи.
   Очень большую программу  из области фи-
  нансов следует писать на языке, разрабо-
  танном для обработки чисел  и таком, что
  программы в случае  необходимости  можно
  легко  модифицировать.С  другой  стороны
  нет ничего  хуже,чем игра для аркады,на-
  писанная на языке  "бейсике", - когда вы
  сядете играть,она окажется  слишком мед-
  ленной.

   ЧТО ТАКОЕ ЯЗЫК АССЕМБЛЕРА?

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

   00100001
   00000000
   01000000

  и т.д.

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

   01110111

   Между языком ассемблера и машинным язы-
  ком есть только  одно  различие:язык ас-
  семблера на один уровень выше,чем машин-
  ный язык.Его легче  читать  человеку,чем
  машинный язык,но с другой стороны,ЭВМ не
  может читать язык ассемблера.
   Он  не  является  адаптацией  машинного
  языка,подобно <Бейсику>.Для  каждой  ко-
  манды языка ассемблера имеется  идентич-
  ная (по функции) команда машинного  язы-
  ка и наоборот.Иными словами, между ними
  имеется взаимно  однозначное  соответст-
  вие.Поэтому можно  сказать, что язык ас-
  семблера эквивалентен машинному языку.
   Язык  ассемблера  использует  мнемонику
  (или сокращения)  для повышения удобочи-
  таемости.Например, на данной стадии обу-
  чения команда INC HL  может почти ничего
  не означать для вас, но,по крайней мере,
  вы можете ее прочитать.Если бы вы сказа-
  ли , что  INC - стандартное   сокращение
  INCREASE (увеличить), а HL - переменная,
  то просто  посмотрев  на  эту команду вы
  можете получить  представление о том,что
  происходит.Таже  самая команда на машин-
  ном языке имеет вид 00100011.
   Теперь, очевидно, вы можете так же про-
  читать эту  команду в том смысле,в кото-
  ром вы можете прочитать число.Это не бу-
  дет много  для  вас означать,если только
  у вас нет  справочной  таблицы  или  ваш
  мозг действует почти как ЭВМ.
   Язык ассемблера может быть преобразован
  непосредственно в машинную  программу  с
  помощью программы или вами  самими.Такая
  программа   называется  "АССЕМБЛЕРОМ".Вы
  можете рассматривать  ее  как программу,
  выполняющую довольно утомительную задачу
  трансляции вашей, написанной  на   языке
  ассемблера программы  в   последователь-
  ность  команд  машинного языка, понятных
  SPECTRUM и мы  считаем,что ассемблер для
  ZX-SPECTRUM уже имеется.
   Тем  не  менее, такие ассемблеры обычно
  требуют  6K памяти  и имеют ограниченное
  применение на ЭВМ с  объемом памяти 16K.
  Дисплей SPECTRUM  отнимает  7K памяти, и
  после  загрузки  ассемблера  у вас может
  остаться всего  4K памяти для  программы
  на языке  ассемблера  (это означает при-
  мерно 500B программы на машинном языке).
   Альтернативный  способ  работы - вместо
  применения ассемблера  самому транслиро-
  вать мнемонику языка ассемблера в машин-
  ный язык вручную, применяя уже давно су-
  ществующие таблицы.
   Это трудно,поначалу кажется безнадежно,
  неудобно,но  это - прекрасная практика и
  дает вам глубокое понимание того,как ра-
  ботает Z-80.
   Мы на самом деле  рекомендуем, чтобы вы
  попытались написать  таким способом  ко-
  роткую программу на  машинном языке,т.е.
  написать их на языке  ассемблера и вруч-
  ную   транслировать  на  машинный язык -
  прежде чем  покупать программу ассембле-
  ра.

   ЗАКЛЮЧЕНИЕ.

   ЦП

   Центральный процессор ЭВМ.Это - чип,вы-
  полняющий в  ЭВМ вычислительные и управ-
  ляющие функции.

   МАШИННЫЙ ЯЗЫК

   Язык , воспринимаемый ЦП.Для ЦП <SPECT-
  RUM> это  машинный язык Z-80, содержащий
  около 696 команд.

   ЯЗЫК БЕЙСИК

   Язык   программирования , разработанный
  так, чтобы быть понятным  человеку.Когда
  ЭВМ выполняет команду на языке БЕЙСИК,ей
  приходится  транслировать  эту команду в
  последовательность команд машинного язы-
  ка.Поэтому  программы  на  языке  БЕЙСИК
  значительно медленнее работают,чем прог-
  раммы на машинном  языке,но их легче пи-
  сать.

   ЯЗЫК АССЕМБЛЕРА

   Представление команд  машинного языка в
  сокращенной , понятной  человеку записи.
  Например, HALT - ассемблерный эквивалент
  команды машинного языка 01110110.

   ПРОГРАММА АССЕМБЛЕРА

   Программа, транслирующая  команды языка
  ассемблера (удобочитаемые и понятные че-
  ловеку) в команды машинного  языка,восп-
  ринимаемые ЭВМ.

   ПОСТОЯННО ЗАПОМИНАЮЩЕЕ УСТРОЙСТВО (ПЗУ)

   Большая программа  на  машинном  языке,
  обычно называемая программируемым обору-
  дованием;программа , жестко встроенная в
  аппаратуру ЭВМ;она  сохраняется даже при
  отключении питания.Для SPECTRUM ПЗУ зап-
  рограммировано  в  машинных кодах Z-80 и
  написано специально  для него.ПЗУ SPECT-
  RUM занимает ячейки памяти с 0 по 16383.
  Вы можете обращаться  к содержимому этих
  ячеек,тогда как остальную  память вы мо-
  жете не только читать,но и  изменять,как
  требуется.

   ОСНОВНЫЕ ПОНЯТИЯ МАШИННОГО ЯЗЫКА

   Что такое ЦП ?

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

   ВЫВОДЫ

   РЕГИСТРЫ

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

   ЯЧЕЙКИ ПАМЯТИ

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

   СТЕК

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

   ВОЗМОЖНЫЕ КОМАНДЫ

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

   КАК СЧИТАЕТ ЭВМ ?

   Все числа  ЭВМ  записывает  в  двоичном
  (битовом)  формате.Например число 54 за-
  писывается в  битах  так: 01100110. Ну а
  если десятичное число будет,например та-
  ким:8880.Для  того,чтобы перевести такое
  число в  двоичное  для  удобства,сначала
  переводят его в число шестнадцатеричного
  формата.Такие числа записываются следую-
  щим образом: числу 1 соответствует 1;
               числу 2 соответствует 2;
  и так  далее  до числа 9,но вы,наверное,
  думаете,что и после 9 идет 10,однако это
  не   совсем  так.Посмотрите, как  дальше
  строится числовой ряд: числу 10 - #0A;
                         числу 11 - #0B;
                         числу 12 - #0C;
  и   так  далее  до  числа  15; 15 - #0F;
  А число 16  записывается   так: #10,т.е.
  если прибавить 1,то запись  идет  в сле-
  дующий разряд числа.Все  шестнадцатерич-
  ные числа от #00 до #FF (255) занимают в
  памяти 1  байт, а числа, большие чем 255
  занимают 2  байта, например, число #4000
  (десятичный эквивалент 16384).

  Например,если взять  команду  ассемблера
  LD HL,#7FFD,то она будет равносильна ко-
  манде LD HL,32765 или
        LD HL,%0111111111111001

  Как вы заметили, тут присутствует значок
  <%>.В дальнейшем  мы будем его применять
  для  обозначения  двоичного  исчисления.
   Теперь мы  вам покажем , как переводить
  числа из одной системы  счисления в дру-
  гую.Сначала обозначения:

      BIN - двоичное (значок %)
      DEC - десятичное
      HEX - шестнадцатеричное (значок #)

   Теперь перевод из BIN в DEC:
  Возьмем для примера число %01101101. Это
  десятичный  эквивалент  числа 109. Чтобы
  получить это число , вам надо для начала
  разложить число %01101101  на две тетра-
  ды,таким образом:  %0110 и %1101. Первая
  тетрада  будет  означать  второй  разряд
  числа,а вторая - первую. Теперь значения
  значащих битов:
     0   0   0   0   0   0   0   0
     128 64  32  16  8   4   2   1

   Эти значения битов значащие,только тог-
  да, когда тот  бит, которому принадлежит
  значение,установлен в 1.
   Если теперь мы подставим наше значение,
  то мы получим:  

     0   1   1   0   1   1   0   1
     0   64  32  0   8   4   2   1

   Сложив эти значения,мы получим значение
  109.Как вы видите,это очень просто,необ-
  ходимо только  знать значение  соответс-
  вующего ему бита. Еще легче получить HEX
  число. Для этого  вам  следует вспомнить
  тетрады.Итак:

       %0110       %1101

   При подсчете мы получим  значение в ле-
  вой тетраде 6,а в правой - 13.Теперь,ес-
  ли перевести эти два  значения в HEX, то
  мы получим значение #6D, ну а если вы не
  верите, то переведите самостоятельно это
  число в DEC, и вы убедитесь, что эти два
  значения DEC и HEX  совпадают. Как  вы в
  будущем увидите - шестнадцатеричный спо-
  соб задания  данных  в память ЭВМ значи-
  тельно удобнее,чем десятичный или двоич-
  ные способы.
   Теперь мы  займемся  переводом из HEX в
  DEC:

   Для  примера , возьмем   число   #9C40.
  Обозначим  числа 9,C,4,0 через  X,Y,Z,T.
  Получим число  #XYZT.Теперь разобьем его
  на 4 числа таким образом:

      9         C         4         0
      X*4096    Y*256     Z*16      T*1

   Теперь займемся  подсчетом нашего выра-
  жения  9*4096+12*256+4*16+0*1.Оно  будет
  равно 40000! Вот таким макером вы сможе-
  те переводить любые числа от 0 до 65535.
   Ну  а  чтобы  нам не тратить лишнюю па-
  мять для текста, мы лишь напишем формулу
  для перевода из DEC в HEX.Вот она:

  HEX=INT(X/4096+(INT(Y/256)+(INT(Z/16))+T

   Теперь после этого  короткого  экскурса
  вы сможете переводить числа из таких 3-х
  систем счисления,как BIN,DEC,HEX.

                  *  *  *



Other articles:


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

Similar articles:
Iron - an overview of the microprocessor Zilog Z380, continued.
Advertising - advertising and announcements.
Coder - private moments in the work of TR-DOS (TR-DOS port level).

В этот день...   21 November