Witam serdecznie :)
Chyba nie do końca rozumiem Assembler, gdyż ostatnio natknąłem się na zagwozdkę. Mianowicie:
Żeby mój kod był piękny i czytelny postanowiłem napisać wszystkie procedury, do których będę się później odwoływał, w osobnym pliku .asm. Utworzyłem również prosty .inc w którym przechowuję makra i definicje rejestrów roboczych.
W czym rzecz...
W pliku głównym (załóżmy main.asm) załączam na początku potrzebne pliki, tj. nagłówkowy danego procesora i wszystkie, które utworzyłem w projekcie. Więc cały program poglądowo wygląda tak:
/*Plik główny programu*/
.include "procesor.inc"
.include "Procedury.asm"
.include "Procedury_Biblioteki.inc"
Main:
mov R16, R17
...
rcall Procedura_z_pliku ;Wywołanie procedury z pliku Funkcje.asm
rjmp Main
/*Plik z procedurami: Procedury.asm*/
Procedura_z_pliku:
...
mov R18, R19 ;Jakieś tam przykładowe rozkazy
ret
Inna_Procedura:
...
in R16, PortA
...
ret
/*Plik nagłówkowy: Procedury_Biblioteki.inc*/
.equ PortA = Jakis_Port
...
Gdy rozpoczyna się działanie programu widzę, że program pierwsze co robi to wskakuje do pliku z ciałami procedur i stara się przejść je wszystkie, ale co więcej, zatrzymuje się na pierwszej z nich (czyli przykładowo na Procedura_z_pliku) i po dotarciu do ret wykonuje ją znów. Nic w tym dziwnego, ale problem w tym, że nie tego oczekuję. Chciałbym, by program wykonywał TYLKO to co kolejno napisałem w pliku głównym, a do plików "dodatkowych" skakał tylko gdy wywołam jedną z procedur w nim zadeklarowanych. Podobne zachowanie znam z innych języków (C, lub C++).
Jak to wykonać? Jak sprawić, by program zachowywał się tak, jak to opisałem?
Czy w assemblerze (Dla ścisłości chodzi o rodzinę AVR) jest to możliwe do otrzymania? Jeśli tak, to jak?
Liczę na pomoc i wyjaśnienie mi jeśli czegoś nie rozumiem :)
Pozdrawiam :)