Код последней подпрограммы приведен в Программе 8.4. Эта программа практически идентична Программе 8.1. Отличие между ними заключается в замене директивы org на TEXT code и cblock на TEMP udata_ovr для распределения автоматических локальных переменных. Данные передаются в подпрограмму посредством 2-байтной глобальной переменной SQR_ROOT, которая объявлена как внешняя (место под эту переменную было выделено в файле main.asm). Имя подпрограммы SQR_ROOT опубликовано как глобальное, чтобы ее было видно из файла main.asm.
include "p16f627.inc"
extern SUM; 2-байтное число (старший: младший)
TEMP udata_ovr; Автоматические переменные
I res 2; Магическое число (старший: младший)
COUNT res 1; Счетчик цикла
; ------------------------------
TEXT code
SQR_ROOT clrf COUNT; Задача 1: Обнулить счетчик цикла
clrf I; Задача 2: Записать 1 в магическое число
clrf I+1 incf I+1,f
SQR_LOOP movf I+1,w; Задача 3а: Number — I
subwf SUM+1,f; Вычитаем мл. байт I из мл. байта Num
movf I,w; Берем старший байт магического числа
btfss STATUS,С; Пропускаем, ЕСЛИ не было заёма
addlw 1; Корректируем заём
subwf SUM,f; Вычитаем старшие байты
btfss STATUS,С; ЕСЛИ нет заёма, ТО продолжаем
goto SQR_END; ИНАЧЕ процесс завершен
incf COUNT,f; Задача 3б: ИНАЧЕ инкрементируем счетчик цикла
movf I+1,w; Задача 3в: Увеличиваем магическое число на 2
addlw 2
btfsc STATUS,С; ЕСЛИ нет переноса, ТО продолжаем
incf I,f; ИНАЧЕ прибавляем перенос к старшему байту
movwf I+1
goto SQR_LOOP
SQR_END movf COUNT,w; Задача 4: Возвращаем счетчик цикла в качестве корня
return
global SQR_ROOT
end
Как и во всех исходных файлах, в файле root.asm используются различные регистры специального назначения, такие как STATUS. Поэтому заголовочный файл pic 16f627.inc включается в каждый из исходных файлов. Поскольку содержимое данного файла представляет собой набор директив equ, имена, определяемые в этом файле, публикуются как абсолютные и не затрагиваются компоновщиком. По этой причине в шар-файле (Листинг 8.6) эти фиксированные идентификаторы не указываются. Однако они выводятся в файл листинга, генерируемый компоновщиком.
Чтобы связать вместе эти три исходных файла, в командной строке при запуске компоновщика перечисляются имена входных объектных файлов, имя командного файла компоновщика и имена шар-файла и файла с машинным кодом. В нашем случае эта строка будет следующей:
mplink.exe rms.lkr main.о sqr.о root.о /m rms.map /о rms.hex
Понятно, что сгенерированный шар-файл будет называться rms.mар, а файл с абсолютным машинным кодом — rms. hex.
Для документирования проекта компоновщик генерирует составной файл листинга, похожий (но более полный) на файл, текст которого приведен в Листинге 8.2, и опциональный map-файл. Как видно из Листинга 8.6, этот файл состоит из двух списков. В первом из них приводится информация по каждой секции. Список включает имя секции, тип, начальный адрес, местоположение секции (в памяти программ или памяти данных) и ее размер в байтах. Из таблицы использования памяти программ (Program Memory Usage) видно, что было использовано 63 ячейки памяти программ, включая два байта вектора сброса команды goto — или примерно 6 % от имеющегося объема.