31 января 1996

  Этот раздел справедливо можно разделить
на две части.  Первая часть будет для на-
чинающих свой путь  в мир языка програми-
рования 'ассемблер'. Вторая часть для уже
успевших основательно  изучить последний,
но неосвоевших его окончательно или чуст-
вующих  сложность  в програмировании  под
систему is-dos.

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

  Десятичные  числа  вам знакомы это есть
0,1,2,3,..,9,10,11,..,19,20,21,... и т.д.
Как видите  их название произошло от того
что  во всех этих  числах участвуют цифры
от 0 до 9, их как раз десять.

  Двоичные цифры. Вы правильно поняли они
состоят всего из двух цифр 0 и 1,  напри-
мер 0,1,10,11,100,101,111,1000 и т.д. Как
их сравнить с десятичными, очень просто.

 Десятичные   Двоичные
      0          0
      1          1
      2         10
      3         11
      4        100
      5        101
 и т.д.

  В  ассемблере  они обозначаются  знаком
'%',  т.е  когда  мы  пишем %10010011, то
имеем  в  виду  число  147 десятичное. Вы
спросите, как же это касается компьютера?
Дело  в  том,  что  каждая  ячейка памяти
(байт)  может может принимать значения от
0  до  255 или %00000000 - %11111111. Это
хорошо  видно если в basic-е вы проведете
эксперимент:  poke  16384, <число 0-255>.
Если  вы  зто сделали то увидели, что вся
картина  с  пикселами (точками на экране)
очень напоминает двоичный код. Включенно-
му пикселу соответствует 1, а выключенно-
му  0.  Теперь давайте подумаем как легче
нарисовать  картинку записывая туда деся-
тичное  число  или двоичное где виден нам
каждый  пиксел. Кстати не пытайтесь в во-
дить  в  basic-е двоичную форму числа, он
слишком стар и не образован. Если в экан-
ной области есть название пиксел то в ра-
бочей  памяти  это  называют бит. Расклад
здесь такой:

              Число 0..255.
┌────┬────┬────┬────┬────┬────┬────┬────┐
│7bit│бbit│Sbit│Чbit│Зbit│2bit│1bit│Obit│
└────┴────┴────┴────┴────┴────┴────┴────┘

  Если бит включен то там 1, выключен 0.
Пример:
%10000000 = 128
7bit включен, остальные выключены.

  Все  слишком просто? Мы с вами согласны
двоичный  код слишком прост, что при мно-
жестве чисел можно запутаться, десятичный
же неудобен. Выход есть, это шестнадцати-
ричный код или числа (разницы нет).
  Вы спросите,  где взять еще шесть цифр?
Выход находится если взять дополнительные
цифры из латинского алфавита A,B,C,D,E,F.
Теперь  мы имеем все что нужно.  А как же
это будет выглядеть на деле?

Десятичное  Двоичное  Шестнадцатиричное
    0        %0000         0
    1        %0001         1
    2        %0010         2
    3        %0011         3
    4        %0100         4
    5        %0101         5
    6        %0110         6
    7        %0111         7
    8        %1000         8
    9        %1001         9
   10        %1010         A
   11        %1011         B
   12        %1100         C
   13        %1101         D
   14        %1110         E
   15        %1111         F

  Интересная  получилась  закономерность.
%1111 = F то %11111111 = FF.  Значит один
байт можно представить не восмью разряда-
ми как  вдвоичном коде,  и не тремя как в
десятичном, а лиш двумя.

Пример:
255=%11111111=FF

  Есть одно но, что бы компьютер не путал
десятичное с шестнадцатиричным  есть спе-
циальный знак  '#' (#7C),  или другой 'h'
(7Ch),  но тут нужно оговорить если число
начинается  с буквы  то в переди ставится
еше и нуль (OACh), это только для 'h'.  И
еще IS-ASSMBLER,  GENS,  ZEUS не понимают
этой буквы, но зато TASM и все ассемблеры
на более крутых машинах поймут то  и дру-
гое.  Может шестнадцатиричные числа и по-
кажутся  вам трудной  системой счисления,
но вспомните когда вы учились читать, вам
тоже казалось  слишком  все это умным.  А
теперь вас это даже не беспокоит. Но влю-
бом случае  в ассемблере без этого значка
'#' нечего делать.  Или вам придется зах-
ломлять  программы  двоичным  кодом,  что
приведет  к трудно читамости  ее для  вас
самих же,  так что  не принебригайте этим
как не принебрегаете буквами при чтении.

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


      РЕГИСТРЫ ДАННЫХ И АККУМУЛЯТОР
      ═════════════════════════════

  В микропроцессоре Z-80,  который управ-
ляет  вашим компьютером есть  специальные
ячейки где хранятся временные числа с ко-
торыми вы работаете и где они претерпива-
ют свои изменения.  Назовем ячейки словом
регистр. Все вычисления и передача данных
работают  только  через регистры.  Что бы
сложить два числа нужно сначало поместить
их в регистры и затем сложить их,  причем
результат будет в одном из регистров. Вот
они A,B,C,D,E,H,L,F. В каждом этом регис-
тре может  находится число  от 0  до 255.
Причем B и C, D и E, H и L, могут объеди-
нятся, что говорит о расширении диапазона
используемых чисел от 0 до 65535. Пишутся
они BC, DE, HL.  Но это  не все  есть еще
альтернативный набор (запасной),  A', B',
C', D', E', H', L', F', они так и обозна-
чаются  черточкой после буквы.  Процессор
может  работать только с одной групой ре-
гистров  либо с основными, либо с альтер-
нативными.  Есть  команды переключающие с
одного набора на другой, причем альтерна-
тивные  становятся  основными  (без '), а
основные  альтернативными  (с '). Опреди-
лить какой из наборов включен невозможно.
  Есть регистры уже сдвоеные  и разделить
их не возможно это IX, IY.

  Регистр "A" самый главный  его называют
аккумулятором,  при вычислении в основном
туда помещается результат.

  Регистр  "F"  самый  интересный  там не
хранят числа но смотрят что произошло при
вычислении.  Здесь весь расклад только по
битовый.

           ┌─┬─┬─┬─┬─┬───┬─┬─┐
           │S│Z│x│H│x│P/V│N│C│
           └─┴─┴─┴─┴─┴───┴─┴─┘
            7 6 5 4 3  2  1 0

  Каждый  отдельный бит  в нем называется
флагом. Флаг установлен = 1, флаг сброшен
= 0.

  Z(zero)-флаг нуля. Устанавливается если
результат операции равен нулю.

  P/V(parity/overflow)-флаг  четности пе-
реполнения.  В логических операциях уста-
навливается  при получении четности резу-
льтата, в арифметической - при переполне-
нии  (число  больше  127, т.е. 7bit вклю-
чен).

  CY(carry)-флаг переноса. Устанавливает-
ся если при выполнении арифметических оп-
ераций, т. е. получилось число больше или
меньше чем влезет в регистр.

  S(sing)-флаг вычитания. Устанавливается
если предыдущей командой было вычитание.

  Остальные флаги расчитаны на внутреннюю
работу процессора. И использовать их зат-
руднительно.


             СЧЕТЧИК КОМАНД
             ══════════════

  Выполняя  очередную команду,  процессор
должен знать, откуда ему взять следующую.
За этим следит  16-разрядный  счетчик ко-
манд регистр PC.  Он может принимать зна-
чения  от 0 до 65535.  Поэтому Z-80 может
понимать в своей работе только эти адреса
и  не на один адрес больше, в компьютерах
128k  и  больше  все  так же, но там есть
альтернативные  страницы  памяти  которые
могут  подменятся на основные, так только
удается обмануть процессор.


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

  16-разрядный регистр указателя стека PC
дополнительная возможность для програмис-
та. Это специально  устанавливаемая поль-
зователем часть оперативной памяти, пред-
назначенная  для временного хранения дан-
ных.  Стек организован по принципу первый
вошел, последним вышел. При каждой записи
регистр  PC  уменьшается на 2. При взятии
данных  обратно  увеличивается  на 2. Ре-
гистр  PC показывает адрес где располога-
ется  стек.  Общение со стеком происходит
только с регистровыми парами.


             ДРУГИЕ РЕГИСТРЫ
             ═══════════════

  Регистр  вектор прерываний I, использу-
ется во втором режиме прерываний.  Его мы
расмотрим когда займемся самии прерывани-
ями.
  Регистр регенерации динамической памяти
R,   обслуживает  аппаратные  потребности
процессора  и изменяется  не предсказуемо
(не совсем правильно).  Используется  для
написания процедур случайного числа. Ста-
рший  разряд  аппаратно  не используется,
заметьте это,  редко  им  кто пользуется,
наверно  програмисты  в попыхах  изучения
ассемблера не придали этому значения.

  На этом мы остановимся  на теме для на-
чинающего до следущего номера журнала.  И
продолжим  для  тех  кто уже  практически
использовал  програмирование  в  машинном
коде.

  Вы наверное  не раз  пытались использо-
зовать  трансляторы  as.com  и  link.com.
Если   кому-то  это  не  удалось,  то  мы
подскажем.  
  Во первых программа должна быть набрана
в текстовом редакторе is-edit и иметь ра-
сширение 'as'. Затем пишется bat-файл ко-
торый будет транслировать програму в объ-
ектный код.  Можно сделать еще проще, вам
известен файл extent.txt так вот в ведите
туда строку:

as :Q:IS-ASSMASMas /+l /+t /cut

  Теперь любой  файл можно  от транслиро-
вать всего лишь нажатием клавиши [ENTER].
Если вдруг  вы не поняли  значение ключей
то посмотрите help as.com. Учтите что но-
вый файл с расширением 'obg' еще не готов
к запуску т.к. не прошел через линковщик.

  С link.com сложнее здесь если  вы хоти-
те создать запускаемый файл который обра-
щается к вашей библиотеке (к файлам выпо-
лняющим какие-то функции нужные програме,
но этот текст  невошел  в саму программу,
программа обращается  к ним типа  CALL $<
имя процедуры>),  то вам  следует создать
bat-файл указывающий имена всех не вошед-
ших процедур.

Пример:
 демо.obg - главная программа;
 $string.obg - процедура бегущей строки;
 $cls.obg -процедура оригинальной очистки
                                  экрана;
(все файлы в одном каталоге с bat-файлом)

  Здесь bat-файл будет такой:

Q:IS-ASSMASMlink_/<адрес трансляции>_
демо_$string_$cls

_ - это пробел (строка не поместилась).
  Весь текст только в одной строке.

  Надеемся принцип работы ясен, а по клю-
чам вы найдете информацию в help link.com
и др.
  Теперь  некоторые процедуры которые по-
могут в вашей сложной работе. Прежде все-
го мы опубликуем процедуры логики,  срав-
нения 16-битовых чисел.  Эти процедуры мы
использовали  для изготовления  журнала и
они нам послужили для вычисления  начала/
конца текста.

1.Сравнить HL>DE
 (вход:HL-1е число);
 (     DE-2е число);
 (выход:флаг C=1-ошибка);

$OPB   LD   A,D       ;сравнить   старшие
       CP   H         ;байты.
       JR   C,OPB2    ;если  H>D  (верно)
                      ;переходим  на про-
                      ;цедуру выхода вер-
                      ;но.
       JR   NZ,OPB1   ;если  H не равен D
                      ;то переход не вер-
                      ;но.
       LD   A,E       ;сравнить   младшие
       CP   L         ;байты.
       JR   C,OPB2    ;L>E, верно.
OPB1   SCF            ;установим  флаг  C
       RET            ;т.к. HL>DE не вер-
                      ;но.
OPB2   XOR  A         ;сбросим  флаг C т.
       RET            ;к. HL>DE.

2.Сравнить HL=DE
 (вход:HL-1е число);
 (     DE-2e число);
 (выход:флаг C=1-ошибка);
$OPBR  LD   A,D      ;сравниваем  старшие
       CP   H        ;байты.
       JR   C,OPBR1  ;H>D-нет ошибки.
       LD   A,H      ;сравниваем    опять
       CP   D        ;старшие байты.
       RET  C        ;H не равно D-ошибка
       LD   A,L      ;сравниваем  младшие
       CP   E        ;байты.
       RET  C        ;L



Other articles:


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

Similar articles:
Likbez - Assembler view from afar: What is a stack. Determination of the stack.
From the Editor - the latest events in the life of newspaper publisher.

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