MPASM 4.02 Released ROOT_ABS.ASM 9-23-2005 17:15:57 PAGE 1
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
00001; Глобальные объявления
00002 include "p16f84a.inc"; Заголовочный файл
00001 LIST
00002; P16F84A.INC Standard Header File, V2.00 Microchip Tech, Inc.
00003
00004 cblock h’26’; Качало блока переменных (с регистра h’26’)
00000026 00005 NUK:2; Старший байт (NUM), младший байт (NUM+1)
00006 endc; Конец блока
00007; Основной цикл —
0000 2200 00008 MAIN call SQR_ROOT; Фиктивный основной цикл
0001 0063 00009 sleep; Останавливаемся
00010; ---------------------------------
00011
00012; *********************************
00013; * ФУНКЦИЯ: Вычисляет корень квадратный *
* из 16-битного целого *
00014; * ПРИМЕР: Number = h’FFFF’; (65,535), *
* Root = h’FF’ (255) *
00015; * ВХОД: Number а регистре NUM: NUM+1 *
00016; * ВЫХОД: Корень в W. NUM: NUM+1; I:I+1 и COUNT измен. *
00017; **********************************
00018
00019; Локальные объявления
00020 cblock
00000028 00021 I:2, COUNT:1; Магическое число и счетчик цикла
00022 endc
00023
0200 00024 org h’200’; Код размещается в памяти программ начиная с h’200’
0200 01АА 00025 SQR_ROOT clrf COUNT; Задача 1: Обнулить счетчик цикла
00026
0201 01А8 00027 clrf I; Задача 2: Инициализация магического числа единицей
0202 01А9 00028 clrf I+1;
0203 0АА9 00029 incf I+1,f;
00030
00031; Задача 3: ВЫПОЛНЯТЬ
0204 0829 00032 SQR_LOOP movf I+,w; Задача За: Number — I
0205 02A7 00033 subwf NUM+1,f; Вычитаем из мл. байта исходного числа
0206 0828 00034 movf I,w; Берем старший байт магического числа
0207 1С03 00035 btfss STATUS,С; ЕСЛИ не было заема (С==1), ТО пропускаем
0208 3Е01 00036 addlw 1; Учитываем заем
0209 02А6 00037 subwf NUM,f; Вычитаем старше байты
00038
00039; Задача 3б: ЕСЛИ потеря значимости, ТО выйти
020A 1С03 00040 btfss STATUS,С; ЕСЛИ нет заема (С==1), ТО продолжаем
020В 2Ф13 00041 goto SQR_END; ИНАЧЕ вычисление завершено
00042
020D 0829 00045 movf I+1,w; Задача 3 г: Увеличиваем магическое число на 2
020Е ЗЕ02 00046 addlw 2
020F 1803 00047 btfsc STATUS,С; Если нет переноса, ТО пропускаем
0210 0АА8 00048 incf I,f; ИНАЧЕ корректируем старший байт
0211 00А9 00049 movwf I+1
0212 2А04 00050 goto SQR_LOOP
0213 082А 00052 SQR_END movf COUNT,w; Задача 4: Возвращаем счетчик цикла в качестве значения корня
0214 0008 0005З return
00054 end
SYMBOL TABLE
LABEL VALUE
С 00000000
COUNT 0000002А
I 00000028
MAIN 00000000
NUM 00000026
SQR_END 00000213
SQR_LOOP 00000204
SQR_ROOT 00000200
STATUS 00000003
__16F84A 00000001
MEMORY USAGE MAP ('X' = Used, '-' = Unused)
0000: XX ---------------------- ------------ ------------ ------------
0200: ХХХХХХХХХХХХХХХХ ХХХХХ--- ------------ ------------
All ocher memory blocks unused.
Program Memory Words Used: 23
Program Memory Words Free: 1001
Errors: 0
Warnings: 0 reported, 0 suppressed
Messages: 0 reported, 0 suppressed