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

 
 
> Как вызвать процедуры из другого модуля?
Firebird
сообщение May 19 2008, 11:14
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 4-01-08
Пользователь №: 33 813



Добрый день!
Всех поздравляю с победой сборной России на чемпионате мира по хокею!!! 08.gif

У меня такая задача, есть файл main.asm, здесь вся логика программы, решил вывести процедуры инициализации в отдельный файл init.asm

main.asm
Main
call InitProc
.....
goto Main


init.asm
InitProc
.....
return

Однако компилятор выдает ошибки, как правильно организовать вызов процедур расположенных в другом модуле. Какие директивы нужно использовать???
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
Grigorij
сообщение May 19 2008, 12:11
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 10-03-07
Пользователь №: 26 038



Цитата(Firebird @ May 19 2008, 15:14) *
Добрый день!
Всех поздравляю с победой сборной России на чемпионате мира по хокею!!! 08.gif

У меня такая задача, есть файл main.asm, здесь вся логика программы, решил вывести процедуры инициализации в отдельный файл init.asm

main.asm
Main
call InitProc
.....
goto Main
init.asm
InitProc
.....
return

Однако компилятор выдает ошибки, как правильно организовать вызов процедур расположенных в другом модуле. Какие директивы нужно использовать???

В MPLab я делал следующим образом:

файл main.asm
Код
....
#include "uart.inc"

....

;основная программа
MAIN:
    
     CALL   INIT_UART

....

     MAIN_CYCLE:    
     GOTO MAIN_CYCLE

END


файл uart.inc
Код
;настройка UART
INIT_UART

....

RETURN


В Вашем случае, создаем файл init.inc в него выносим подпрограммы инициализации. В файле main.asm добавляем #include "init.inc".
Go to the top of the page
 
+Quote Post
vanner
сообщение May 19 2008, 12:11
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 23-10-05
Пользователь №: 10 016



Когда же вы начнете читать манулы?

В модуле init.asm объяви процедуру как глобальную, т.е.
Код
GLOBAL InitProc

Можеш создать файл init.inc и приинклюдить его к main.asm или прямо в main.asm объявить эту процедуру как внешнюю.
Код
EXTERN InitProc
Go to the top of the page
 
+Quote Post
Firebird
сообщение May 20 2008, 10:26
Сообщение #4





Группа: Новичок
Сообщений: 7
Регистрация: 4-01-08
Пользователь №: 33 813



Я сделал так:

Полный код
main.asm
Код
LIST P=18F458    ;директива для указания процессора
#include <P18F458.INC>;файл спецификации процессора
;******************************************************************************

;Биты конфигурации
CONFIG    OSC = LP    ;Выбор осциллятора
;******************************************************************************


;******************************************************************************

;Вектор сброса
ORG    0x0000

goto    start    ;переход к началу программы
;******************************************************************************

;Вектор прерывания высокого приоритета
;Этот код начнет выполнение при возникновении прерывания высокого приоритета,
;или любого прерывания, если приоритеты не используются

ORG    0x0008

bra    HighInt    ;переход к обработке прерывания высокого приоритета
;******************************************************************************

;Обработка прерывания высокого приоритета
HighInt:

;*** код обработки прерывания высокого приоритета размещается здесь ***
retfie    FAST

start
    call    StartInit
    goto    Main
;******************************************************************************

;Начало главной программы
Main:
    call    StartInit
    nop
    goto    Main

;    *** главный код размещается здесь ***

; Подключаемые модули
    #include <MyINI.ASM>
;******************************************************************************
    END


MyIni.asm

Код
StartInit
        clrf    RegA
        clrf    RegB
        movlw    0x01
        movwf    RegA
        movlw    0x05
        movwf    RegB
return


делал как написано в справке с помощью директив GLOBAL и EXTERN, но при компиляции выдается ошибка: "Directive only allowed when generating an object file", т.е. НЕ РАБОТАЕТ.

Сообщение отредактировал Firebird - May 20 2008, 10:28
Go to the top of the page
 
+Quote Post
volodya
сообщение May 21 2008, 07:11
Сообщение #5


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

Группа: Свой
Сообщений: 194
Регистрация: 14-02-07
Из: УКРАИНА
Пользователь №: 25 344



Цитата(Firebird @ May 20 2008, 13:26) *
Я сделал так:

Полный код
main.asm
Код
LIST P=18F458;директива для указания процессора
#include <P18F458.INC>;файл спецификации процессора
-------
;Вектор сброса
ORG    0x0000

goto    start;переход к началу программы
;******************************************************************************

;Вектор прерывания высокого приоритета
;Этот код начнет выполнение при возникновении прерывания высокого приоритета,
;или любого прерывания, если приоритеты не используются

ORG    0x0008

bra    HighInt;переход к обработке прерывания высокого приоритета
;******************************************************************************

;Обработка прерывания высокого приоритета
HighInt:

;*** код обработки прерывания высокого приоритета размещается здесь ***
retfie    FAST

start
    call    StartInit
    goto    Main
;******************************************************************************

;Начало главной программы
Main:
    call    StartInit
    nop
    goto    Main

;    *** главный код размещается здесь ***

; Подключаемые модули
    #include <MyINI.ASM>
;******************************************************************************
    END


MyIni.asm

Код
StartInit
        clrf    RegA
        clrf    RegB
        movlw    0x01
        movwf    RegA
        movlw    0x05
        movwf    RegB
return


делал как написано в справке с помощью директив GLOBAL и EXTERN, но при компиляции выдается ошибка: "Directive only allowed when generating an object file", т.е. НЕ РАБОТАЕТ.


ORG - директива для программ минующих стадию линковки (АСМ -> HEX)- весь текст в одном файле

при организации объектных модулей используется CODE - (эквивалент ORG адрес необязателен можно отдать на откуп линкеру) для программ и UDATA(UDATA_ACS etc.)

GLOBAL & EXTERN используется для передачи меток ОЗУ, ПЗУ между объектными модулями.
а ругается софтинка на ОРГ(если в проекте несколько ASM файлов)


--------------------
"Для того чтобы избежать критики, надо ничего не делать, ничего не говорить и никем не быть"
"Каждый из нас бывает дураком по крайней мере пять минут в день; мудрость заключается в том, чтобы не превысить лимит." Элберт Хаббард
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 23:52
Рейтинг@Mail.ru


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