Программирование на машинном языке

Команды, выполняемые ЭВМ, представляют собой двоичные числа. которые центральный процессор (ЦП) выбирает из памяти точно так же, как и любые другие данные, а затем декодирует их и выполняет требуемые операции. Например, команда МП Intel 8080, которая выполняет сложение содержимого регистра общего назначения <РОН) и аккумулятора, представляет собой 8-разрядное двоичное число

100 000 00.

Эта команда выглядит точно так же, как дополнительный код числа ! 28 или восемь младших двоичных разрядов адреса 128. Электронно-вычислительная машина определяет, является ли выбранное из памяти число командой, частью адреса или просто частью данных в зависимости от торо, в какой фазе цикла выполнения команды оно находится. Таким образом, ЭВМ может интерпретировать одно и то же число из одной и той же ячейки памяти тремя совершенно различными способами.

Одинаковое представление данных, адресов и команд в памяти ЭВМ является одной из многих трудностей, связанных с составлением программ непосредственно в той форме, в которой машина могла бы их выполнять Подобный способ составления программ называется пр^враммщуовттм на машинном языке. Например, на рис. 4.1 приведена программа на машинном языке МП Intel 8080, которая пересылает содержимое десяти последовательных ячеек памяти, начиная с адреса 4016, в десять новых ячеек, начиная с адреса 6016. Очевидно, что разобраться в работе такой программы, внести в нее изменения и использовать ее будет достаточно сложно.

 

Адрес

Содержимое

Адрес

Содержимое

0

00100001

8

01111110

1

01000000

9

00010010

2

00000000

10

00100011

3

00010001

11

00010011

4

01100000

12

00000101

5

00000000

13

11000010

6

00000110

14

00001000

7

00001010

15

00000000

 

 

16

01110110

 


 Чтобы следить за изменением содержимого ячеек памяти, регистров и признаков, программисту notpe6yeix^ таблица двоичных кодов команд и лист бумаги. Он также должен хорошо владеть двоичной арифметикой и хорошо разбираться в огранизации МП Intel 8080. Работать с двоичными числами достаточно трудно, а различать, что ячейка 6 содержит команду, ячейка 7 — данные, ячейка 14—часть адреса, почти невозможно. Поэтому большинство программистов не составляет свои программы непосредственно на машинном языке.

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

Чтобы упростить описание ЭВМ, изготовитель обозначает команды и регистры символическими именами.

Символические имена являются мнемоническими; это значит, что они вызывают ассоциации с функциями, выполняемыми командами, или е назначением регистров.

Приведем типичные примеры мнемонических обозначений:

ADD — сложить SUB — вычесть LD — загрузить JMP — перейти А — аккумулятор X — индексный регистр

Программист обязан, естественно, присвоить символические имена данным и адресам, используемым в своей программе, и построить таблицы двоичных эквивалентов этих имен. Программу, показанную на рис. 4.1, можно записать в форме, приведенной на рис. 4.2. При этом были использованы правила составления программ на языке ассемблера. В табл. 4.1 показан перевод символических имен, определенных в программе, в их двоичные эквиваленты. Подобный способ составления программ называется программированием на языке ассемблера, а процёсс преобразования программ в двоичную форму — ручным ассемблированием.

Поскольку различные команды МП Intel 8080 занимают различное число ячеек памяти, необходимо определить действительный адрес, соответствующий имени TRANS. Это можно сделать, либо непосредственно определив, какое число ячеек занимают все предшествующие этой точке команды, либо предварительно преобразовав программу в двоичную форму и затем отыскав нужные адреса в программе на машинном языке.

Очевидно, что в программе, показанной на рис. 4.2, легче разобраться, чем в программе, приведенной на рис. 4.1. Данным, адресам и командам даны различные обозначения. Мнемонические коды команд, выбранные изготовителем, соответствуют выполняемым машинным командам. Для данных и адресов выбраны такие имена, которые определяют смысл их использования в программе. Правильность программы можно проверить перед загрузкой ее в ЭВМ.

И все-таки процесс программирования еще не очень удобен. Необходимо переводить код каждой команды в двоичной эквивалент, запоминать, требует ли команда дополнительных слов для указания данных и адресов, и, если требует, представлять себе, каков формат этих дополнительных ячеек. Необходимо создать таблицу, подобную табл. 4.1, присвоить значения различным именам или определить их значения из двоичной программы и преобразовать данные и адреса в двоичную форму. Очевидно, при этом приходится повторять много одинаковых действий, что утомляет и может привести к незначительным, но имеющим катастрофические последствия ошибкам. Если потребуется использовать буквенные или цифровые коды, относительные адреса или программы, написанные кем-либо другим, возникнут дополнительные трудности. Программирование на языке ассемблера с ручным ассемблированием легче программирования на машинном языке, но, естественно, это не лучший способ писать сложные программы.



Ручное ассемблирование затрудняет также и процесс отладки. Кроме распознавания таких ошибок, как неправильные коды команд или ошибочные двоичные преобразования, программист, использующий ручное ассемблирование, обязан следить за всеми последствиями каждого изменения (в тексте программы). Например, если в программе на рис. 4.2 по ошибке была опущена команда MVI В, COUNT, которая задает начальное значение счетчика 10, то программа будет работать неверно. Однако простое добавление этой команды не сделает программу правильной. Так как новая команда занимает две дополнительные ячейки памяти, необходимо скорректировать также все адреса в программе, расположенные ниже вставленной команды. Например, адрес TRANS следовало бы изменить с 6 на 8. Таким образом, любое изменение, которое предполагает вставку или удаление команд или использование разных областей памяти под данные, приводит к необходимости повторить ручное ассемблирование. Трудности и большая вероятность появления ошибок при составлении и отладке программ, ассемблируемых вручную, очевидны.