Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практ.раб.#6 Архитектура ЭВМ.doc
Скачиваний:
19
Добавлен:
10.11.2018
Размер:
522.24 Кб
Скачать

Машинно-ориентированные языки (Автокод — Ассемблер)

Процесс программирования на ЯМК по ряду причин достаточно сложен:

  • необходимо самому распределять память под данные и по­стоянно помнить в какой ячейке что находится;

  • иметь дело с цифровыми кодами команд, запоминать ко­торые не очень удобно;

  • при модификации (исправлении) программы, добавлении (удалении) в нее команд требуется тщательно корректиро­вать адреса передачи управления.

Программа-переводчик, которая автоматически распределя­ет память, распознает мнемо­ни­чес­кие обозначения команд и в конечном итоге получает готовую к исполнению программу на машин­ном языке, называется Ассемблер (Автокод).

Язык ассемблера естественным образом связан с ЯМК ма­шины и поэтому называется машинно-ориен­тированным. В ка­честве примера рассмотрим Ассемблер СМ «Малютка» и Авто­код УК «Ней­ман».

Запишем на Ассемблере решение задач из примеров 2 и 4 предыдущего пункта.

Пример 6 (программа с линейной структурой). Вычислить выражение a = bcde.

Решение.

Программа на Ассемблере СМ «Малютка».

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 — останов машины.

Отметим, что

  1. для констант в Ассемблере используются мнемонические имена, а в Автокоде специальное обо­значение (< число>);

  2. обозначение адресов для передачи управления и в Ассем­блере и в Автокоде производится с по­мощью меток; в свою очередь, используя метки как имена переменных, можно ра­ботать с ко­мандами как с данными (см. пример 5 из предыду­щего пункта).

Программы, записанные на Ассемблере (Автокоде), компью­тер выполнить не может до тех пор, по­ка они не будут пере­ведены на ЯМК. Такой перевод осуществляет специальная про­грамма тран­сля­тор с Ассемблера (Автокода), для которой исходной информацией является текст на Ас­сем­б­ле­ре (Авто­коде). Процедура трансляции начинается с поиска синтакси­ческих ошибок в тексте про­г­рам­мы. Обнаружив ошибку, транс­лятор выводит сообщение, указывая на место ошибки в прог­рам­ме и ее характер. Получив такое сообщение, програм­мист должен исправить ошибку и снова пов­то­рить трансляцию. Так продолжается до тех пор, пока не будут исправлены все синтаксические ошиб­ки. Описанные действия называются син­таксической отладкой программы. Синтаксическая от­ладка выполняется программистом совместно с транслятором.

Если синтаксических ошибок не обнаружено, то начинается второй этап работы транслятора — пе­ре­кодировка программы в машинные коды. Результатом этой работы является машин­ный код (про­граммы на ЯМК).

А теперь опишем алгоритм, по которому работает транслятор с Ассемблера (Автокода) после за­вершения синтаксической от­ладки.

  1. Распределение памяти под программу. Поскольку каждая команда Ассемблера (Автокода) пе­реводится в одну команду машинного языка, описание данных содержит необходимую ин­формацию о размерах требуемой под них памяти и програм­ма располагается в ОП, на­чи­ная с нулевой ячейки, то легко определить адрес начала собственно программы (адрес ее по­с­лед­ней команды).

  2. Распределение памяти под данные. Сразу вслед за пос­ледней командой программы по­ме­ща­ют­ся переменные и кон­станты в той последовательности, в которой они встречаются в про­грам­ме на Ассемблере (Автокоде).

  3. Перекодировка команд. Каждая команда на Ассемблере (Автокоде) переводится в соответ­ст­ву­ющую команду на машин­ном языке. При этом мнемонический код заменяется на код опе­рации, а переменные и константы — на их машинные ад­реса. Константы переводятся в дво­ичную систему и записыва­ются в отведенные для них ячейки.

Пример 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

10

х:=2*2

04

00

10

FC

Вывод х

08

77

Останов машины

00

00

00

02

Константа 2

10

Память под переменную х