Wątek przeniesiony 2018-11-08 11:35 z Inne języki programowania przez Marooned.

Assembler i pliki z procedurami

0

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 :)

0

AVR nie znam, ale tak generalnie to asembler nie rozróżnia "co jest czym" w kodzie. Jak sobie zrobisz deklaracje zmiennych z danymi w miejscu które może być wskazywane przez instruction pointer to komputer spróbuje ci "wykonać" tamten kod. Spróbuj to sobie includować w miejscu kodu w które nie da się skoczyć.

0

Includuj na końcu źródła, jeśli taka jest natura tego assemblera, że co pierwsze jest w kodzie to oznacza faktyczny entrypoint, lub po prostu wrzuć jmp main i po tym includuj jak chcesz sobie na początku procki pododawać, jeśli assembler czy też linker posiada taką opcję to ustaw entrypoint na main lub skorzystaj z dostępnych dyrektyw assemblera, żeby go poinformować, że ma zaczynać wykonywanie od main (o ile takie są dostępne).

1 użytkowników online, w tym zalogowanych: 0, gości: 1