Выбрать главу

movf NUM_1,w; Копируем содержимое NUM_1 в W

addlw 4; Прибавляем к нему число 4

movwf NUM_2; Копируем NUM_1 + 4 в NUM_2

Текст после символов «;» называется комментариями, которые используются для облегчения понимания программы.

Код, записанный таким образом, представляет собой программу на языке ассемблера. Синтаксису этого языка, а также процессу преобразования написанных на нем программ в исполняемый двоичный код полностью посвящена восьмая глава книги.

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

* * *

В основе работы любого вычислительного устройства лежит периодическое выполнение цикла выборкаисполнение. При этом каждая команда поочередно выбирается из памяти программ, интерпретируется и исполняется. Поскольку память, к которой обращается программа в процессе выполнения, является памятью данных, а каждое устройство памяти имеет собственные шины, операции выборки и исполнения могут осуществляться параллельно. Таким образом, во время выборки n-й команды исполняется команда n — 1. На Рис. 3.4 показано, что коды обеих команд, как следующей, так и текущей, хранятся в двух внутренних регистрах команд — IR1 и IR2 соответственно. Команды, считанные из памяти программ, загружаются в начало этого конвейера и «выталкиваются» в дешифратор команд с конца конвейера. На Рис. 3.7 изображен развернутый во времени процесс выполнения нашей команды, разбитый на машинные циклы. Во время каждого цикла, за исключением самого первого, выборка новой команды и исполнение предыдущей осуществляются одновременно.

Рис. 3.7. Параллельные потоки выборки и исполнения команд

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

* * *

Выборка (Рис. 3.4)……Цикл 2

• Инкрементируется счетчик команд, чтобы указать на 2-ю команду.

• Одновременно код 1-й команды перемещается по конвейеру (из регистра IR1 в регистр IR2).

• Содержимое счетчика команд (h’001’) выставляется на шину адреса памяти программ.

• После этого на шине данных памяти программ появляется код 2-й команды, который загружается в регистр IR1.

Исполнение (Рис. 3.4)…..Цикл 2

• Адрес операнда h’25’ (т. е. NUM_1) заносится в регистр адреса FAR и выставляется на шину адреса памяти данных.

• Искомое значение, находящееся по адресу NUM_1, выставляется на шину данных памяти данных, после чего загружается в регистр FDR.

• АЛУ переключается в режим пропуска, в котором аргумент с входа АЛУ без изменений копируется в рабочий регистр.

* * *

Выборка….. Цикл 3

• Инкрементируется счетчик команд, чтобы указать на 3-ю команду.

• Одновременно код 2-й команды перемещается по конвейеру (из регистра IR1 в регистр IR2).

• Содержимое счетчика команд (h’002’) выставляется на шину адреса памяти программ.

• После этого на шине данных памяти программ появляется код 3-й команды, который загружается в регистр IR1.

Исполнение ….. Цикл 3

• АЛУ переключается в режим сложения, в котором константа, содержащаяся в коде 2-й команды, прибавляется к содержимому рабочего регистра.

• Результат операции NUM_1 + 4 с выхода АЛУ помещается обратно в рабочий регистр.

* * *

Выборка ….. Цикл 4

• Инкрементируется счетчик команд, чтобы указать на 4-ю команду.

• Одновременно код 3-й команды перемешается по конвейеру (из регистра IR1 в регистр IR2).

• Содержимое счетчика команд (h’003’) выставляется на шину адреса памяти программ.

• После этого на шине данных памяти программ появляется код 4-й команды, который загружается в регистр IR1.

Исполнение ….. Цикл 4

• Адрес операнда h’26’ (т. е. NUM_2) заносится в регистр адреса FAR и выставляется на шину адреса памяти данных.