Главная страница / 26. Эволюция и классификация языков прог...: 26.2. Низкоуровневые язык...
26.2. Низкоуровневые языки программирования
← 26.1. Что такое язык программирования? | 26.3. Языки высокого уровня → |
Машинные языки и машинно-ориентированные языки – это языки низкого уровня, требующие указания мелких деталей процесса обработки данных. Языки высокого уровня имитируют естественные языки, используя некоторые слова разговорного языка и общепринятые математические символы. Такие языки более удобны для человека.
При программировании на машинном языке программист может держать под своим контролем каждую команду и каждую ячейку памяти и использовать все возможности имеющихся в компьютере операций. Текст программы получается громоздкий, труднообозримый, программу трудно отлаживать, изменять и развивать. Поэтому в случае, когда нужно иметь эффективную программу, в максимальной степени учитывающую специфику конкретного компьютера, вместо машинных языков используют близкие к ним машинно-ориентированные языки (ассемблеры).
Язык ассемблера – это машинно-зависимый язык низкого уровня, в котором короткие мнемонические имена соответствуют отдельным машинным командам. Используется для представления в удобочитаемой форме программ, записанных в машинном коде.
Язык ассемблера позволяет программисту пользоваться текстовыми мнемоническими (т. е. легко запоминаемыми человеком) кодами, по своему усмотрению присваивать символические имена регистрам компьютера и памяти, а также задавать удобные для себя способы адресации. Кроме того, он позволяет использовать различные системы счисления (например, десятичную или шестнадцатеричную) для представления числовых констант, использовать в программе комментарии и др. Программы, написанные на языке ассемблера, требуют уже значительно меньшего объема памяти и времени выполнения. Знание программистом языка ассемблера и машинного кода дает ему понимание архитектуры машины.
Для того чтобы написать программу на языке ассемблера для конкретного компьютера, необходимо знать его архитектуру.
Самыми рутинными операциями при программировании в кодах были:
- формирование кода команды;
- вычисление физических адресов ячеек с данными;
- вычисление смещений для команд условного и безусловного ветвлений.
Для первой проблемы было найдено следующее решение: для каждой машинной команды подбирались краткие мнемоники, отражающие ее суть. Например, для команды пересылки данных – MOV, для команды сложения – ADD и т.п. Такие мнемоники намного легче запомнить, чем двоичные, восьмеричные или шестнадцатеричные коды команды; кроме того, их не в пример легче читать, а это тоже немаловажно при отладке программы или ее изменении. Вторая и третья проблемы также были решены без особых усилий: вместо использования реальных адресов в тексте программы располагались символические метки, а программа, генерирующая машинный код, вычисляла фактическое расположение ячеек в оперативной памяти и поставляла его в код.
В качестве примера приведем программу на языке ассемблера для IBM PC. Программа вычисляет значение a = b + c для целых a, b и c.
.MODEL | SMALL | Директива .MODEL задает механизм распределения памяти под данные и команды. | |
.DATA | Директива .DATA определяет начало участка программы с данными. | ||
b | DW | 5 | Директивы DW задают типы переменных и их значения. |
c |
DW |
3 | |
a | DW | ? | |
.CODE | Директива .CODE определяет начало участка программы с командами. | ||
begin | MOV | AX,@DATA | Команды MOV AX,@DATA и MOV DS,AX записывают адрес сегмента данных в регистр DS (Data Segment) |
MOV | DS,AX | ||
MOV | AX,B | Для вычисления a используются команды MOV AX, B, ADD AX,C и MOV A,AX. | |
ADD | AX,C | ||
MOV | A,AX | ||
MOV | AH,4CH | ||
INT | 21H | ||
END | begin | В директиве END задана метка первой выполняемой инструкции программы - begin. |
Перевод программы с языка ассемблера на машинный язык осуществляется специальной программой, которая называется ассемблером и является по сути простейшим транслятором.
← 26.1. Что такое язык программирования? | 26.3. Языки высокого уровня → |