реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Вставка кусков ассембера в С от Hi-tech
SergSit
сообщение May 10 2009, 16:29
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 173
Регистрация: 9-12-05
Пользователь №: 12 031



Понадобилось вставять в программу, написанную на С ( компилытор от Hitech), куски ранее написаные на ассемблере. Для начала решил попробывать пример из руководства. Создал файл с расширением .as, куда включил пример взятый из руководства.
#include <aspic.h>
GLOBAL _add
SIGNAT _add,8298
FNSIZE _add,0,4
psect text0,local,class=CODE,delta=2
_add:
movf ?_add+2,w
addwf ?_add,f
btfsc STATUS,0
inc ?_add+1,f
movf ?_add+3,w
addwf ?_add+1,f
return
Данный файл включил в проект. В главном файле определил прототип:
extern unsigned int add(unsigned a, unsigned bb);

После компиляции получаю сообщение:
Error [800] prob_asm.pre; 115. undefined symbol "?_add"
Что делаю не так? Кто может подскажите.
Go to the top of the page
 
+Quote Post
petrd
сообщение May 11 2009, 04:10
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 3-06-08
Пользователь №: 38 012



попробуйте вместо одного знака подчеркивания ставить два.
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post
DL36
сообщение May 11 2009, 06:31
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006



Цитата(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
Go to the top of the page
 
+Quote Post
SergSit
сообщение May 11 2009, 09:38
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 173
Регистрация: 9-12-05
Пользователь №: 12 031



Спасибо за участие. Решение найдено)). Необходимо было включить в код строку global ?_add. Все работает. Только удручает, что этой строки не было в коде из мануала(((
Go to the top of the page
 
+Quote Post
DL36
сообщение May 11 2009, 17:40
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 460
Регистрация: 5-10-06
Из: Херсон
Пользователь №: 21 006



Цитата(SergSit @ May 11 2009, 12:38) *
Спасибо за участие. Решение найдено)). Необходимо было включить в код строку global ?_add. Все работает. Только удручает, что этой строки не было в коде из мануала(((

Скорее тут
Go to the top of the page
 
+Quote Post
SergSit
сообщение May 12 2009, 12:01
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 173
Регистрация: 9-12-05
Пользователь №: 12 031



Ваши примеры тоже помогли. За что Вам спасибо. Все решила следующая цитата из мануала :

Цитата
• Ensure any symbol used to hold arguments to the routine is globally accessible


Только в мануале написано , а приведенном примере из мануала почему то не пишут положенные оператор global ?_....(((
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 10:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01386 секунд с 7
ELECTRONIX ©2004-2016