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 и выставляется на шину адреса памяти данных.