|
Micro
#21
08 июля 1999 |
|
Учебник - Программирование в машинных кодах и на языке АССЕМБЛЕРА (часть первая).

<< И Н Ф О Р К О М >>
ПЕРСОНАЛЬНЫЙ КОМПЬЮТЕР
"ZX-SPECTRUM"
Программирование в машинных кодах
и на языке АССЕМБЛЕРА
Москва 1993
Книга является наиболее доступным изда-
нием по программированию в машинных кодах
для широко распространенных персональных
компьютеров "ZX-Spectrum" (система "Синк-
лер"). В доступной для начинающих форме
рассмотрена система команд процессора,
описан встроенный калькулятор, разобраны
многочисленные примеры. Книга содержит ин-
тересные рекомендации по просмотру машин-
ного кода фирменных программ.
Предназначена для самостоятельного обу-
чения.
ОТ АВТОРОВ
Книга, которую Вы держите в руках, уже
получила широкую известность, как самый
доступный самоучитель для тех, кто хочет
преодолеть психологический барьер и перей-
ти от программирования на БЕЙСИКе к прог-
раммированию в машинном коде или просто
хочет понимать машинный код фирменных
программ. Первое издание этой книги мы вы-
пустили два года назад, в 1990 году, и
сейчас в стране уже есть тысячи любителей
бытовых персональных компьютеров типа
ZX_Spectrum (система "Синклер"), самостоя-
тельно освоивших тонкости машинного прог-
раммирования по этой книге. Первое издание
было выпущено в трех томах. Сейчас мы об-
ъединили все три тома (учебник, практикум
и справочник) в рамках единой книги, нес-
колько подкорректировали и значительно
(примерно на 20%) дополнили содержание.
Основным дополнением стали разделы, посвя-
щенные описанию системы прерываний комп-
ьтера, разбору концепции потоков и кана-
лов, понятию о директивах АССЕМБЛЕРа и
вопросам, связанным со стандартизацией ру-
сификации компьютеров. Как показал первый
опыт, именно эти вопросы нуждались в уси-
ленном освещении.
"ИНФОРКОМ" продолжает работу над книга-
ми, посвященными компьютерам "Спектрум" и
совместимым с ними. В настоящий момент на-
чат выпуск многотомного издания, посвящен-
ного работе с графикой "Спектрума". Нес-
мотря на то, что каждый из этих томов яв-
ляется самостоятельной учебной единицей и
может быть использован независимо от про-
чих, тем не менее, их можно считать логи-
ческим продолжением данного издания уже
хотя бы потому, что "Первые шаги в машин-
ном коде Z-80" в силу естественных причин
стали базовой книгой для наших последующих
разработок. "ИНФОРКОМ" благодарит всех чи-
тателей первого издания, приславших свои
отзывы, пожелания и рекомендации и особо
выражает персональную признательность сво-
им корреспондентам Баянову К.Н. за подго-
товку разделов I.5.18, II.4.4.7, III.5 и
Пашорину В.И. за подготовку раздела
II.5.5.
"ИНФОРКОМ".
Москва, август 1992.
ВВЕДЕНИЕ
Проведенное в начале 1990 года анкетиро-
вание наших заказчиков показало их глубо-
кую заинтересованность в освоении програм-
мирования в машинных кодах для Синк-
лер-совместимых компьютеров, получивших в
нашей стране наибольшее распространение
среди ПЭВМ бытового класса.
Процессор Z-80, на базе которого собраны
компьютеры этой системы, приобрел широкую
популярность в мире благодаря своей уни-
версальности, наличию обширной системы ко-
манд и технологичности производства, обес-
печившей ему большие объемы выпуска при
сравнительно невысокой цене.
Этот процессор применяется не только в
многочисленных компьютерах, входящих в
систему "Синклер-Спектрум", но и в компью-
терах других систем. Среди них компьютеры
семейства MSX ("ЯМАХА", "СПЕКТРОВИДЕО",
"ТОШИБА", "ПАНАСОНИК" и др.), компьютеры
систем "ЭНТЕРПРАЙЗ", "ШАРП", многие комп-
ьютеры фирмы "АМСТРАД" и пр. В принципе,
материалы этой книги могут быть на 90% ис-
пользованы и теми, кто работает с компью-
терами этих систем. В настоящее время про-
цессор Z-80 очень хорошо документирован в
мировой литературе. Наиболее фундаменталь-
ными трудами для программистов любого
уровня являются монографии Лэнса Левенталя
(LANCE A.LEWENTHAL) "Программирование на
Ассемблере Z-80" ("Z-80 ASSEMBLY PROGRAM-
MING"), а также "Процедуры на Ассемблере
для процессора Z-80" ("Z-80 ASSEMBLY LAN-
GUAGE SUBROUTINES).
Эти очень хорошие книги, к сожалению,
весьма объемны (по 500-600 стр.) и не пе-
реведены на русский язык, что делает сом-
нительной возможность их широкого расп-
ространения у нас в ближайшие годы.
Многочисленные прочие книги зарубежных
авторов, посвященные программированию для
Синклер-совместимых компьютеров в машинном
коде, имеют в качестве недостатков либо
недостаточную систематичность изложения,
либо повышенную инструктивность подачи ма-
териала. В первом случае они оказываются
неплохим подручным справочником, а во вто-
ром - неплохим учебником, но для тех, кто
уже в принципе подготовлен. Учебником же
для тех, кто самостоятельно начинает раз-
бираться с самого начала, они могут слу-
жить очень ограниченно.
В своей книге, предлагаемой Вашему вни-
манию, мы постарались, как сумели, соче-
тать популярность, систематичность и ин-
формативность изложения. Те, кто не нужда-
ются в элементарном освоении программиро-
вания в машинных кодах, могут сразу обра-
титься ко второй части "Практикум...".
Чтобы не дублировать справочный материал,
который необходим как тем, кто работает с
первой частью, так и тем, кто работает со
второй, мы вынесли его отдельно, в третью
часть.
Мы очень рекомендуем сопровождать чтение
этой книги самостоятельным просмотром кода
фирменных программ с помощью какой-либо
дисассемблирующей программы, например MO-
NITOR 16/48, MONS 3, ULTIMON и т.п.
Мы должны также порекомендовать Вам наше
периодическое издание "ZX-РЕВЮ". На его
страницах Вы сможете найти почти все, что
Вам может потребоваться из программного и
информационного обеспечения компьютеров
системы "Синклер" и кое-что, связанное с
аппаратными вопросами.
У нас возможно приобретение полных годо-
вых комплектов "ZX-РЕВЮ" за 1991 и за 1992
год, выполненных в виде отдельной книги.
Выходят и выпуски 1993 года. Для справки
укажем, что объем одного полного годового
комплекта "ZX-РЕВЮ" примерно в 5 раз пре-
восходит объем данной книги.
Свои пожелания, замечания и предложения
Вы можете направить нам по адресу 121019,
Москва, Г-19, а/я 16. Вы всегда сможете
выбрать из списка выпущенной нами литера-
туры то, что Вам будет по душе.
I. ПЕРВЫЕ ШАГИ В МАШИННЫХ КОДАХ
1. САМЫЙ - САМЫЙ ПЕРВЫЙ ШАГ...
Многие любители не испытывают серьезных
трудностей в овладении БЕЙСИКом. Для этого
достаточно сравнительно немного практики.
Но рано или поздно они приходят к барьеру
"машинного кода". Как это ни печально, но
некоторые так перед ним и останавливаются.
Это ни в коей мере не связано с отсутстви-
ем желания или способностей, просто многие
не знают, с чего начать. Если в БЕЙСИКе
можно начинать с чего угодно (при ошибке
компьютер сам Вас поправит), то здесь Вы
оказываетесь с процесором один на один, и
такой метод проб и ошибок не срабатывает.
Одним словом, есть некий психологический
барьер, который бывает трудно преодолеть в
одиночку. Известно, что для того, чтобы
научиться программировать, надо взять и
начать программировать. "ИНФОРКОМ" предла-
гает Вам следующий компромиссный подход -
сначала в рамках этой главы мы, беря "быка
за рога", просто начнем программировать, а
затем посвятим оставшуюся часть книги сис-
тематическому изложению материала. Итак,
давайте напишем первую программу в машин-
ном коде. Прежде всего, выделим для нее
область памяти. Если Вы читали нашу книгу
"Большие возможности Вашего "Спектрума",
то знаете, что для БЕЙСИКа в оперативной
памяти компьютера отведена область памяти,
начинающаяся с адреса, на который указыва-
ет системная переменная PROG и заканчива-
ется адресом, на который указывает систем-
ная переменная RAMTOP. Предположим, что Вы
хотите записать программу в машинных ко-
дах, начиная с адреса 30000. Дайте команду
CLEAR 29999. Эта команда установит RAMTOP
в 29999 и Ваша программа будет защищена от
возможной порчи из БЕЙСИКа. Даже если Вы
дадите команду NEW, области памяти, нахо-
дящиеся выше RAMTOP, не будут поражены.
Теперь дайте две прямые команды одну за
другой:
POKE 30000,0
POKE 30001,201
Мы сейчас записали два числа в нужные
нам адреса. Они образуют простейшую прог-
рамму. Выполнить ее можно командой RANDO-
MIZE USR 30000. Попробуйте сами... Вам по-
кажется, что ничего не произошло, но это
не так. Сначала процессор обратился по ад-
ресу 30000 и нашел там число 0, которое
обозначает машинный код операции NOP. Опе-
рация NOP (NO OPERATION - нет операции)
дает команду процессору, что ничего делать
не надо. В течение 0,0000014 сек. он дейс-
твительно ничего не делает, а затем пере-
ходит к следующему адресу, где находит
исло 201.
Это команда RET (RETURN - возврат). Она
дает процессору указание прекратить в этом
месте программу в машинных кодах и вер-
нуться туда, откуда она вызывалась, т.е. в
нашем случае - в БЕЙСИК. Это самое процес-
сор и сделал, о чем Вы получили сообщение
БЕЙСИКа "О.К.".
Если все, что Вы здесь прочитали, Вам
понятно, то Вы уже поняли, как составляют-
ся программы в машинных кодах. Можно, ко-
нечно, возразить, что пользы от такой
программы не очень много, но сейчас не в
этом суть. Важно, чтобы Вы поняли, что не-
кая последовательность чисел может быть
последовательностью команд для процессора
Z-80.
К сожалению, для нас мало что говорит
простая последовательность чисел вроде та-
ких, как 0 и 201. Держать в памяти коды
всех команд процессора (а их около семи-
сот) непросто, но дело упрощается тем, что
есть промежуточный язык между процессором
и человеком - язык АССЕМБЛЕРа. У каждого
кода есть своя мнемоника АССЕМБЛЕРа. Мне-
моника - это набор букв, являющихся сокра-
щением английских слов. Для нашего примера
программа на АССЕМБЛЕРе выглядит так:
NOP
RET
Перевод этих мнемоник в машинные коды
тоже можно поручить компьютеру. Для этого
существуют специальные программы, которые
тоже называют АССЕМБЛЕРами. Есть и проти-
воположные программы - ДИСАССЕМБЛЕРы. Они
наоборот переводят машинные коды в мнемо-
ники АССЕМБЛЕРа.
И тех программ и других достаточно мно-
го. Часто они объединяются в пакеты. Широ-
ко распространены пакеты GENS3/MONS3 фирмы
HISOFT и EDITAS/MONITOR 16/48 фирмы PICTU-
RESQUE. Здесь GENS3 и EDITAS - АССЕМБЛЕРы,
а MONS3, MONITOR 16 и MONITOR 48 - ДИСАС-
СЕМБЛЕРы.
Теперь давайте вернемся к нашей первой
программе и попробуем ее несколько раз-
вить, чтобы она все же что-то делала. Про-
цессор Z-80 имеет несколько регистров, у
которых есть имена - "А", "В", "С" и т.д.
Каждый из них может содержать одно какое-
либо целое число от 0 до 255 (т.е. один
байт).
Существуют десятки команд процессора,
которые позволяют копировать содержимое
регистров из одного в другой, а также вы-
полнять связь с внешним миром, в т.ч. и с
оперативной памятью.
Так, например, команда АССЕМБЛЕРа LD B,A
(машинный код - 71) означает "загрузить
содержимое регистра А в регистр В". LD -
это сокращение от LOAD (LOAD - ЗАГРУЗКА).
Точно так же LD C,B (машинный код 72)
означает "загрузить в регистр С содержимое
регистра В". Можно загружать в регистры и
целые числа. Например, LD A,N - означает
"загрузить в регистр А целое число N, где
N может быть числом от 0 до 255". До этого
все команды были однобайтными. Эта же ко-
манда - двухбайтная. Сначала идет машинный
код - 62, а за ним само число - N. Так,
например, LD A,77 (загрузить в регистр А
число 77) будет выглядеть так: 62,77.
Здесь 62 - код операции, - он сообщает
процессору, что надо сделать, а 77 - это
операнд. Заметим здесь же, что бывают опе-
рации и трехбайтные и четырехбайтные. Пер-
вый байт, как правило, - код операции, а
следующие за ним - операнды. Мы говорим
"как правило" потому, что есть некоторые
операции, код которых записывается двумя
байтами /1.
Итак, мы уже готовы к тому, чтобы напи-
сать программу, которая будет перебрасы-
вать какое-либо число из одного регистра
процессора в другой.
──────────────────────────────────────────
/1 ИСТОРИЧЕСКАЯ СПРАВКА: Процессор Z-80
разрабатывался на основе своего предшест-
венника, процессора 8080. Большинство ко-
манд у них совпадают, но для Z-80 было до-
бавлено несколько десятков новых команд.
Чтобы их отличить от команд 8080, они на-
чинаются с префикса 203, 221, 237 или 253
(в шестнадцатиричном коде, соответственно:
CB, DD, ED или FD). Поэтому появились опе-
рации, код которых состоит из двух байтов,
за которыми следуют операнды.
АССЕМБЛЕР МАШИННЫЙ КОД
NOP 30000 0
LD A,77 30001 62
30002 77
LD B,A 30003 71
LD C,B 30004 72
RET 30005 201
Гораздо интереснее было бы организовать
обмен между процессором и оперативной па-
мятью компьютера. Команд, которые позволя-
ют это сделать, тоже очень много. Напри-
мер, это команда LD (NN),A. Ее машинный
код - 50. Она означает следующее: "Загру-
зить в ячейку памяти, адрес которой задан
двухбайтным числом NN, содержимое регистра
A". Эта команда - трехбайтная. Первым идет
код операции (50), а за ним - двухбайтный
операнд NN, который задает нужный Вам ад-
рес. Например, если Вам нужен адрес 30008,
то тогда операнд NN будет иметь вид: 56,
117 потому, что 117*256 + 56 = 30008.
Этот двухбайтный операнд имеет старшую
часть и младшую. Запомните, что двухбайт-
ные числа (как правило, это адреса) хра-
нятся в памяти всегда в обратном порядке,
т.е. сначала младший байт, а потом старший
/1.
Таким образом, команда АССЕМБЛЕРа LD
(30008),A в машинных кодах запишется так:
50, 56, 117.
Существует и противоположная команда LD
A,(NN) - "Загрузить в регистр А содержимое
ячейки памяти, заданной адресом NN". Ее
код - 58, за которым следуют два байта,
указывающие на адрес: сначала младший, а
потом - старший. Тогда LD A,(30007) запи-
шется так: 58, 55, 117.
Теперь мы уже можем перемещать содержи-
мое ячеек памяти из одной в другую, копи-
руя его через регистр А процессора.
──────────────────────────────────────────
/1 ИСТОРИЧЕСКАЯ СПРАВКА: Наш житейский
опыт учит, что сначала идут старшие разря-
ды, а потом младшие. Например, в числе 567
сначала идут сотни (5), потом - десятки
(6) и только затем единицы (7). В компью-
тере - наоборот. Это связано с тем, что
первые компьютеры имели такую маленькую
память, что о старших разрядах речь тогда
и не шла. Они явились более поздним допол-
нением и им пришлось занять не первое мес-
то.
Теперь мы уже можем перемещать содержи-
мое ячеек памяти из одной в другую, копи-
руя его через регистр А процессора.
До операции
┌─────┐ ┌─────┐
│30007│ │30008│
├─────┤┌──┬──┬──┬──┬──┬──┬──┬──┬──┐├─────┤
│ N ││A │. │. │. │. │. │. │. │. ││ - │
└─────┘├──┴──┴──┴──┴──┴──┴──┴──┴──┤└─────┘
│П Р О Ц Е С С О Р │
└──────────────────────────┘
После операции
┌─────┐ ┌─────┐
│30007│ │30008│
├─────┤ ├─────┤
│ N │ │ N │
└─────┘ └─────┘
АССЕМБЛЕР МАШИННЫЙ КОД
LD A,(30007) 30000 58
30001 55
30002 117
LD (30008),A 30003 50
30004 56
30005 117
RET 30006 201
Можно еще несколько усложнить задачу и
попытаться выполнить сложение содержимого
двух каких-либо ячеек памяти и отправить
результат на хранение в какую-либо ячейку.
Для выполнения арифметических действий,
например сложения, процессор Z-80 также
имеет несколько команд. Рассмотрим команду
ADD A,B (ее машинный код - 128). ADD = AD-
DITION = СЛОЖЕНИЕ.
ADD A,B означает следующее: "Прибавить
содержимое регистра B процессора к содер-
жимому регистра А и результат оставить в
регистре А".
Как видите, эта команда однобайтная,
т.к. все указания на то, что откуда взять,
что с ним сделать и куда отправить резуль-
тат, в ней есть уже сами собой.
Предположим, что Вы хотите сложить со-
держимое ячеек 30013 и 30014, а результат
поместить а ячейку 30015. Тогда программа
на АССЕМБЛЕРе и в машинных кодах будет
иметь вид:
АССЕМБЛЕР МАШИННЫЙ КОД КОММЕНТАРИЙ
LD A,(30013) 30000 58 Загрузить в ре-
гистр А число,
30001 61 содержащееся в
30002 117 адресе 30013.
LD B,A 30003 71 Загрузить в ре-
гистр В содержи-
мое регистра А
LD A,(30014) 30004 58 Загрузить в ре-
гистр А число,
30005 62 содержащееся в
30006 117 адресе 30014.
ADD A,B 30007 128 Прибавить к со-
держимому А со-
держимое регист-
ра В.
LD (30015),A 30008 50 Выгрузить содер-
30009 63 жимое регистра A
30010 117 в адрес 30015.
NOP 30011 0 Нет операции.
RET 30012 201 Возврат туда,от-
куда эта про-
грамма вызыва-
лась.
Попробуйте эту программу в работе. Пусть
Вы хотите сложить два числа, скажем 50 и
70. Сначала выделим память для этой прог-
раммы в машинных кодах.
10 CLEAR 29999
Теперь введем эту программу в память,
начиная с адреса 30000.
20 FOR i=30000 TO 30012: READ q: POKE i,q:
NEXT i
30 DATA 58, 61, 117, 71, 58, 62, 117, 128,
50, 63, 117, 0, 201
Запишем в ячейки 30013 и 30014 те два
числа, которые мы желаем сложить:
40 POKE 30013, 50: POKE 30014, 70
Введем команду на исполнение нашей прог-
раммы в машинных кодах.
50 RANDOMIZE USR 30000
И, наконец, стартуем нашу БЕЙСИК-прог-
рамму - RUN.
Через долю секунды она отработает и на
экране появится сообщение О.К. Вроде бы
ничего не изменилось, но если Вы провери-
те, что находится в ячейке 30015, то убе-
дитесь, что там находится результат сложе-
ния, т.е. число 120.
PRINT PEEK 30015 даст Вам: 120 О.К.
Итак, мы уже познакомились с несколькими
командами процессора Z-80. Теперь нам при-
дется прервать такое сверхпопулярное изло-
жение, поскольку система команд этого про-
цессора довольно обширна и при таком под-
ходе пришлось бы отвести ей около тысячи
страниц. Мы надеемся, что психологический
барьер Вы уже преодолели и далее мы пере-
ходим к систематическому и постепенному
освоению системы команд процессора.
Вы, по-видимому, поняли, что всякой ко-
манде в машинных кодах соответствует своя
мнемоника АССЕМБЛЕРа, в которой в несколь-
ких буквах зашифрована суть операции. К
сожалению, обычно литературу пишут профес-
сионалы для профессионалов и они не утруж-
дают себя переводом мнемоник на русский
язык, тем более, что по Z-80 книг на русс-
ком языке почти нет (есть несколько ве-
домственных переводов). Поэтому "Инфорком"
в своем "Справочнике.." (часть 3) уделил
место словарю для перевода мнемоник АС-
СЕМБЛЕРа в нормальный английский, а через
него и в русский язык.
В заключение этой главы несколько общих
замечаний. Различные процессоры имеют раз-
личные системы команд. Знание системы ко-
манд процессора Z-80 еще не означает, что
Вы сможете разбираться в машинном коде
других компьютеров, собранных на других
процессорах, но совершенно точно, что их
освоение пройдет у Вас в десятки раз быст-
рее.
Даже для одного только процессора Z-80
мнемоники до сих пор не стандартизированы.
Многие ассемблирующие программы, например,
EDITAS, ZEUS, GENS1...GENS3 и др. имеют
отклонения в форме записи мнемоник, но они
незначительны и всегда оговариваются в
сопроводительной инструкции к программе.
──────────────────────────────────────────
Тексты предоставлены Михаилом (MIHEICH)
10.07.1999
Другие статьи номера:
AD&D - Значение способностей. |
Проходилка - прохождение игры Magician land. |
Учебник - Программирование в машинных кодах и на языке АССЕМБЛЕРА (часть первая). |
Похожие статьи:
В этот день... 17 ноября