Машинно-ориентированные языки (Автокод — Ассемблер)
Процесс программирования на ЯМК по ряду причин достаточно сложен:
-
необходимо самому распределять память под данные и постоянно помнить в какой ячейке что находится;
-
иметь дело с цифровыми кодами команд, запоминать которые не очень удобно;
-
при модификации (исправлении) программы, добавлении (удалении) в нее команд требуется тщательно корректировать адреса передачи управления.
Программа-переводчик, которая автоматически распределяет память, распознает мнемонические обозначения команд и в конечном итоге получает готовую к исполнению программу на машинном языке, называется Ассемблер (Автокод).
Язык ассемблера естественным образом связан с ЯМК машины и поэтому называется машинно-ориентированным. В качестве примера рассмотрим Ассемблер СМ «Малютка» и Автокод УК «Нейман».
Запишем на Ассемблере решение задач из примеров 2 и 4 предыдущего пункта.
Пример 6 (программа с линейной структурой). Вычислить выражение a = bc – de.
Решение.
Программа на Ассемблере СМ «Малютка».
A: ds 1; — резервируем в памяти одну ячейку под переменную а;
В: dw 8; — резервируем в памяти ячейку под переменную b и заносим туда некоторое значение
(например, число 8);
С: dw 10; — аналогично с;
D: dw 7; — аналогично d;
Е: dw 5; — аналогично е;
ENT; — начало программы;
LDA (В); — загрузили В в сумматор (команда 0);
MULT (С); — умножили содержимое сумматора на С (команда В);
STA (А); — сохранили содержимое сумматора в А (1);
LDA (D); — загрузили D в сумматор (0);
MULT (Е); — умножили содержимое сумматора на С (В);
NEG; — сменили знак содержимого сумматора (300);
ADD (A); — сложили содержимое сумматора со значением из А (А);
STA (А); — сохранили содержимое сумматора в А (1);
IPRT; — печать содержимого сумматора (С00);
HLT; — останов машины (F00).
Программа на Автокоде УК «Нейман».
INPUT В — ввод b;
INPUT С — ввод с;
INPUT D — ввод d;
INPUT E — ввод е;
MUL B,C,A — a: = b x c;
MUL D,E,R — r: = d x e;
SUB A,R,A — a: = a – r;
OUTPUT A — вывод а;
STOP — останов машины.
Как видно из приведенных текстов, распределение памяти под данные в Ассемблере СМ «Малютка» и Автокоде УК «Нейман» происходит по разному: в Ассемблере программист сам распределяет память, указывая мнемонические имена (метки) адресов ячеек, а в Автокоде память отводится автоматически (сразу же после последней команды программы) по мере встречаемости мнемонических имен в тексте программы.
Пример 7 (программа с циклом). Вычислить f = n!
Решениe.
Программа на Ассемблере СМ «Малютка».
F: ds 1; — резервируем в памяти одну ячейку под переменную f;
N: dw 9; — резервируем в памяти ячейку под переменную n и заносим туда некоторое значение
(например, число 9);
ONE: dw 1; — резервируем в памяти ячейку под константу 1;
NONE: dw-1; — резервируем в памяти ячейку под константу -1;
ENT; — начало программы;
LDA (ONE); — загрузили константу 1 в сумматор (команда 0)
STA (F); — сохранили содержимое сумматора в F (команда 1);
M1: LDA (F); — загрузили F в сумматор (0);
MULT (N); — умножили содержимое сумматора на N (В);
STA (F); — сохранили содержимое сумматора в F (команда 1);
LDA (N); — загрузили N в сумматор (0);
ADD (NONE); — сложили содержимое сумматора с константой -1 (А);
STA (N); — сохранили содержимое сумматора в N (1);
JNP M2; — передаем управление на метку М2, если содержимое сумматора 0 (D);
JMP Ml; — передаем управление на метку M1 (4);
М2: LDA (F); — загрузили F в сумматор (0);
IPRT; — вывод содержимого сумматора (С00);
HLT; — останов машины.
Программа на Автокоде УК «Нейман».
INPUT N — ввод n;
MOV<1>,F — f: = l;
LI: MUL F,N,F — f: = f x n;
SUB N,<1>,N — n: = n – 1;
IFGO L1 — передача управления на метку L1, если n > 0;
OUTPUT F — вывод f;
STOP — останов машины.
Отметим, что
-
для констант в Ассемблере используются мнемонические имена, а в Автокоде специальное обозначение (< число>);
-
обозначение адресов для передачи управления и в Ассемблере и в Автокоде производится с помощью меток; в свою очередь, используя метки как имена переменных, можно работать с командами как с данными (см. пример 5 из предыдущего пункта).
Программы, записанные на Ассемблере (Автокоде), компьютер выполнить не может до тех пор, пока они не будут переведены на ЯМК. Такой перевод осуществляет специальная программа транслятор с Ассемблера (Автокода), для которой исходной информацией является текст на Ассемблере (Автокоде). Процедура трансляции начинается с поиска синтаксических ошибок в тексте программы. Обнаружив ошибку, транслятор выводит сообщение, указывая на место ошибки в программе и ее характер. Получив такое сообщение, программист должен исправить ошибку и снова повторить трансляцию. Так продолжается до тех пор, пока не будут исправлены все синтаксические ошибки. Описанные действия называются синтаксической отладкой программы. Синтаксическая отладка выполняется программистом совместно с транслятором.
Если синтаксических ошибок не обнаружено, то начинается второй этап работы транслятора — перекодировка программы в машинные коды. Результатом этой работы является машинный код (программы на ЯМК).
А теперь опишем алгоритм, по которому работает транслятор с Ассемблера (Автокода) после завершения синтаксической отладки.
-
Распределение памяти под программу. Поскольку каждая команда Ассемблера (Автокода) переводится в одну команду машинного языка, описание данных содержит необходимую информацию о размерах требуемой под них памяти и программа располагается в ОП, начиная с нулевой ячейки, то легко определить адрес начала собственно программы (адрес ее последней команды).
-
Распределение памяти под данные. Сразу вслед за последней командой программы помещаются переменные и константы в той последовательности, в которой они встречаются в программе на Ассемблере (Автокоде).
-
Перекодировка команд. Каждая команда на Ассемблере (Автокоде) переводится в соответствующую команду на машинном языке. При этом мнемонический код заменяется на код операции, а переменные и константы — на их машинные адреса. Константы переводятся в двоичную систему и записываются в отведенные для них ячейки.
Пример 8. Рассмотрим трансляцию программы, умножающей 2 на 2.
Программа на Ассемблере СМ «Малютка»
DVA: dw 2
X: ds 1
ENT
LDA (DVA)
MULT (DVA)
STA (X)
IPRT
HLT
Программа на Автокоде УК «Нейман»
MUL <2>,<2>,Х
OUTPUT X
STOP
Результат трансляции программы с Ассемблера на ЯМК.
Адрес |
КОП |
А1 |
Комментарий |
00 |
0 |
03 |
Программа начинается с ячейки 03 |
01 |
0 |
02 |
Здесь будет храниться константа 2 |
02 |
0 |
00 |
Здесь будет значение переменной х |
03 |
0 |
01 |
$:=2 |
04 |
В |
01 |
$:=$*2 |
05 |
1 |
02 |
х:=$ |
06 |
C |
00 |
Вывод х (содержимого сумматора) |
07 |
F |
00 |
Останов машины |
Результат трансляции программы с Автокода на ЯМК.
Адрес |
КОП |
А1 |
А2 |
A3 |
Комментарий |
00 |
03 |
0С |
0С |
10 |
х:=2*2 |
04 |
00 |
10 |
— |
FC |
Вывод х |
08 |
77 |
— |
— |
— |
Останов машины |
0С |
00 |
00 |
00 |
02 |
Константа 2 |
10 |
— |
— |
— |
— |
Память под переменную х |