Цитата(SergSit @ May 10 2009, 19:29)

Понадобилось вставять в программу, написанную на С ( компилытор от Hitech), куски ранее написаные на ассемблере. Для начала решил попробывать пример из руководства. Создал файл с расширением .as, куда включил пример взятый из руководства.
Что делаю не так? Кто может подскажите.
Пример
Код
; Подпрограмма переворачивающая байт
; Записать в файл reverseByte.as
; Объявить extern unsigned char reverseByte( unsigned char var );
;PSECT text0,class=CODE,local,delta=2
psect text,class=CODE,delta=1,reloc=2
global _reverseByte;
signat _reverseByte,4201
_reverseByte:
MOVWF var;
SWAPF var, w;
XORWF var, w;
ANDLW 0x66;
XORWF var, f;
RRCF var, w;
RRCF var, f;
ANDLW 0x55;
ADDWF var, f;
RRCF var, f;
ADDWF var, f;
RLNCF var, w;
return ;
psect temp,global,class=COMRAM,space=1,ovrld
var: ds 1
Цитата(SergSit @ May 10 2009, 19:29)

Понадобилось вставять в программу, написанную на С ( компилытор от Hitech), куски ранее написаные на ассемблере. Для начала решил попробывать пример из руководства. Создал файл с расширением .as, куда включил пример взятый из руководства.
#include <aspic.h>
Error [800] prob_asm.pre; 115. undefined symbol "?_add"
Что делаю не так? Кто может подскажите.
Может быть проблема с сигнатурой.
Поищи на микрочип.су тестер показывал как применять локальные переменные в асмовских функциях.
Вот еще нашел, из старых с вопросом, может поможет.
Код
;******************************************************************************
; Подпрограмма выполнения программной выдержки времени
; Входные данные:
; Переменная типа int
; файл DelayUsInt.as
; необходимо объявить extern DelayUsInt(unsigned int delay);
; При необходимости, привязать к микросекундам
; delay = (((unsigned long long)(x))*(unsigned long long)(XTAL_FREQ))
; /(unsigned long long)(12MHZ);
; Можно delay определить как макрос тогда вычисления константы будет
: производиться на этапе компиляции и точность будет выше
; Где х требуемая задержка в микросекундах
; XTAL_FREQ частота кварца, например #define XTAL_FREQ 40000KHZ
;******************************************************************************
#include <aspic18.h>
global _DelayUsInt
global ?_DelayUsInt
opt pw 80
psect text,class=CODE,delta=1,reloc=2
;signat _DelayUsInt,4200
_DelayUsInt$delay set ?_DelayUsInt
psect text
_DelayUsInt:
movlw low ?_DelayUsInt ;Грузим FSR
movwf FSR0L,c
movlw high ?_DelayUsInt
movwf FSR0H,c
movf POSTINC0,f,c ;Инкрементируем для возможности последующего входа
_DelayUsInt_1: ;Вход после проверки старшего разряда
movf POSTDEC0,f,c ;Поскольку адрес был инкрементирован для старшего разряда
_DelayUsInt_2:
decfsz INDF0,f,c ;Декремент младшей цифры
goto _DelayUsInt_2 ;Крутимся тут до нуля
movf PREINC0,f,c ;Смотрим на старшую цифру
bnz _DelayUsInt_3 ;Если ноль то выход
return
_DelayUsInt_3:
decf INDF0,f,c ;Декремент старшей цифры
goto _DelayUsInt_1