Программирование на машинном языке предполагает работу с двоичными числами, которые процессор выбирает из памяти, декодирует и выполняет необходимые операции. Например, команда сложения в микропроцессоре Intel 8080 представлена 8-разрядным двоичным числом. Одно и то же двоичное число может быть интерпретировано как команда, часть адреса или данные, в зависимости от контекста его использования.
Электронно-вычислительная машина (ЭВМ) определяет, как интерпретировать двоичное число — как команду, адрес или данные — исходя из текущей фазы выполнения команды. Это делает программирование на машинном языке сложным, так как требуется точно знать структуру команд и памяти ЭВМ.
Создание программ непосредственно на машинном языке является трудоемким и подвержено ошибкам. Чтобы упростить этот процесс, используется ассемблер — специальная программа, которая преобразует мнемонические (символические) коды в двоичные, строит таблицы значений и заменяет ссылки на имена соответствующими двоичными числами. ЭВМ выполняет все необходимые операции быстрее и точнее, чем человек.
Программирование на ассемблере с использованием программы-ассемблера более удобно и производительно, чем программирование на машинном языке или ручное ассемблирование. Однако этот процесс связан с изучением правил и форматов, специфичных для каждой системы команд ЭВМ.
Проблема программирования на ассемблере заключается в том, что язык тесно связан со структурой ЭВМ, а не с решаемыми инженерными задачами. Поэтому программистам приходится тратить много времени на манипулирование регистрами и продумывание порядка выполнения команд.
Системы команд ЭВМ отражают технологические особенности их изготовления, зачастую не предлагая отдельных команд для выполнения содержательных операций. Из-за этого программирование на ассемблере занимает много времени, увеличивает вероятность ошибок и затрудняет документирование программ.
Все эти факторы снижают производительность программистов, работающих на языке ассемблера, и делают получаемые программы малополезными для инженерного описания системы.
Таблица, демонстрирующая процесс переноса содержимого из одной области памяти в другую:
Адрес источника | Содержимое источника | Адрес назначения | Содержимое назначения |
---|---|---|---|
4016 | 00100001 | 6016 | 01111110 |
4017 | 01000000 | 6017 | 00010010 |
4018 | 00000000 | 6018 | 00100011 |
4019 | 00010001 | 6019 | 00010011 |
4020 | 01100000 | 6020 | 00000101 |
4021 | 00000000 | 6021 | 11000010 |
4022 | 00000110 | 6022 | 00001000 |
4023 | 00001010 | 6023 | 00000000 |
… | … | … | … |
Эта таблица показывает, как двоичные числа переносятся из одних ячеек памяти в другие, что является частью процесса программирования на машинном языке.