На Рис. 6.11,
Рис. 6.11.
; Глобальные объявления
STATUS equ 3; Регистр STATUS
equ 0; Флаг переноса — бит 0
NUM_H equ h’26’; Исходное значение, старший байт
NUM_L equ h’27’; Исходное значение, младший байт
; ****************
; * ФУНКЦИЯ: Вычисляет корень квадратный из 16-битного целого *
; * ПРИМЕР: Число = h’FFFF’ (65,535), Корень = h’FF’ (d’255’)*
; * ВХОД: Число в регистрах h’26’:h’27’ *
; * ВЫХОД: Корень в W. Регистры h’26’:h’27’ и h’35’:h’36’:h’37’ изменяются *
; *****************
; Локальные объявления
COUNT equ h’35’; Счетчик цикла
I_Н equ h’36’; Магическое число, старший байт
I_L equ h’37’; Магическое число, младший байт
; Задача 1: Обнулить счетчик цикла
SQR_ROOT clrf COUNT
; Задача 2: Инициализация магического числа единицей
clrf I_L
clrf I_H
incf I_L,f
; Задача 3: ВЫПОЛНИТЬ
; Задача 3а: Number — I
SQR_LOOP movf I_L,w; Берем младший байт магического числа
subwf NUM_L,f; Вычитаем из младшего байта исходного числа
movf I_H,W; Берем старой байт магического числа
btfss STATUS,С; ЕСЛИ не было заема (С==1), ТО пропускаем
addlw 1; Учитываем заем
subwf NUM_H,f; Вычитаем старшие байты
; Задача 3б: ЕСЛИ потеря значимости, ТО выйти
btfss STATUS,С; ЕСЛИ нет заема (С==1), ТО продолжаем
goto SQR_END; ИНАЧЕ вычисление завершено
; Задача Зв: ИНАЧЕ инкрементировать счетчик цикла
incf COUNT,f
; Задача 3г: Увеличить магическое число на 2
movf I_L,w
addlw 2
btfsc STATUS,С; Если нет переноса, ТО пропускаем
incf I_H,f; ИНАЧЕ корректируем старший байт
movwf I_L
goto SQR_LOOP
; Задача 4: Вернуть счетчик цикла в качестве значения корня
SQR_END movf COUNT,w; Копируем результат в W
return
Напишите программу умножения содержимого регистра h’46’ на десять (х2 + х8). Для хранения данных и передачи параметров воспользуйтесь программным стеком.
Решение
Объявления глобальных переменных для подпрограммы, код которой приведен в Программе 6.13, и вызывающей процедуры следующие: