Faultless
#04
09 октября 1996 |
|
CPU для вас - программировани для начинающих. Что такой машинный язык? Что такое язык ассемблера? Как считает компьютер?
╔══════════════════════════════════════╗ ║Раздел: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. * * *
Другие статьи номера:
Похожие статьи:
В этот день... 16 октября