╔══════════════════════════════════════╗
║Раздел: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: