Hallo Zusammen
Ich habe ein Problem mit den $External Befehl, der in der Lib offensichtlich nicht wie erwartet funktioniert.
Meine Lib sieht so aus:
Alles anzeigen
In Zeile 6 wird auf die Routine InternInvertByte verwiesen, die von CalcByte benötigt wird.
Ich gehe davon aus, dass der Compiler jetzt diese externe Routine ebenfalls einbinden sollte.
Die Routine CalcByte soll von Bascom aus aufgerufen werden. Diese ruft dann intern die Routine InternInvertByte auf.
Damit sie vom Compiler gefunden wird, ist die Routine in Zeile 6 mit $External angegeben.
Mein Basic-Programm sieht nun so aus:
Alles anzeigen
In Zeile 40 wird die Lib eingebunden, in Zeile 41 die aufzurufende Routine mit $External angegeben.
Danach folgt noch die Deklaration der Routine CalcByte für den Aufruf.
Wenn ich nun versuche zu compilieren, erhalte ich diesen Fehler:
Error : 61 Line : 7 Label not found [INTERNINVERTBYTE], in File : C:\MCS\BASCAVR2083\LIB\DEMOTEST.LIB
Die Fehlermeldung bezieht sich auf die interne Lib-Routine, von der offensichtlich das Label nicht gefunden wird.
Das Label ist aber da. Auch die Blockbezeichnung [InternInvertByte] sind genau wie das Label betitelt.
Was mache ich falsch?
Übrigens lässt sich die Lib fehlerlos mit dem Lib-Manager compilieren.
Entweder findet dieser das Label oder es wird nicht geprüft.
Was ist da los?
Wo liegt der Fehler?
Benutze V2.0.8.3
Ich habe ein Problem mit den $External Befehl, der in der Lib offensichtlich nicht wie erwartet funktioniert.
Meine Lib sieht so aus:
Quellcode: DemoTest.lib
- ;
- ; Demo-Lib
- ;
- [CalcByte]
- $External InternInvertByte
- ; Byte manipulieren
- ; Byte wird in r24 erwartet
- CalcByte:
- MOV r20, r24 ; Byte nach r20 kopieren
- CALL InternInvertByte; Aufruf interne Routine
- MOV r24, r20; Rückgabe in r24
- Ret
- [End]
- [InternInvertByte]
- ; Byte wird in r20 erwartet
- InternInvertByte:
- NEG r20
- Ret
- [End]
Ich gehe davon aus, dass der Compiler jetzt diese externe Routine ebenfalls einbinden sollte.
Die Routine CalcByte soll von Bascom aus aufgerufen werden. Diese ruft dann intern die Routine InternInvertByte auf.
Damit sie vom Compiler gefunden wird, ist die Routine in Zeile 6 mit $External angegeben.
Mein Basic-Programm sieht nun so aus:
BASCOM-Quellcode: Demo.bas
- '
- ' Demo
- ' Fehler beim Compilieren
- ' Beschreibung
- ' ------------
- ' Die Lib "DemoTest.lib" beinhaltet 2 Routinen.
- ' Routine 1: CalcByte(Byval a as Byte)
- ' Sie wird aufgerufen vom Bascom-Programm und übergibt den Parameter "a"
- ' an eine andere Routine innerhalb der Lib. Diese manipuliert den Parameter.
- ' Der Rückgabewert aus der 2. Routine wird in der 1. in r24 kopiert.
- ' Routine 2: InternInvertByte
- ' Sie wird intern, innerhalb der Lib von CalcByte aufgerufen.
- ' Hier wird das übergebene Byte negiert.
- ' Im Bascom_programm wird die Lib eingebunden und mit $External die Routine
- ' CalcByte angegeben
- ' Weiterhin wird die Routine CalcByte in Bascom deklariert.
- ' Problem:
- ' Fehlermeldung beim Compilieren:
- ' Error : 61 Line : 7 Label not found [INTERNINVERTBYTE], in File : C:\MCS\BASCAVR2083\LIB\DEMOTEST.LI
- ' Das Label ist jedoch in der Lib in Zeile 6 mit $External in der Routine CalcByte angegeben.
- ' Warum findet Bascom die interne Unter-Routine nicht?
- ' Was mache ich falsch?
- $Regfile = "m8def.dat"
- $HWStack = 30
- $SWStacK = 30
- $FrameSize = 40
- $Crystal = 8000000
- Config SubMode = New
- Config Base = 0
- $Lib "DemoTest.lib" ' Einbinden der Lib
- $External CalcByte ' nur CalcByte einbinden
- ' die interne Routine InternInvertByte
- ' soll von der Lib intern eingebunden werden
- Declare Sub CalcByte(Byreg r24 as Byte) ' Deklaration der aufzurufenden Sub in der Lib
- Dim a as Byte
- a = &h33
- Do
- a = &h33
- Call CalcByte(a)
- Loop
Danach folgt noch die Deklaration der Routine CalcByte für den Aufruf.
Wenn ich nun versuche zu compilieren, erhalte ich diesen Fehler:
Error : 61 Line : 7 Label not found [INTERNINVERTBYTE], in File : C:\MCS\BASCAVR2083\LIB\DEMOTEST.LIB
Die Fehlermeldung bezieht sich auf die interne Lib-Routine, von der offensichtlich das Label nicht gefunden wird.
Das Label ist aber da. Auch die Blockbezeichnung [InternInvertByte] sind genau wie das Label betitelt.
Was mache ich falsch?
Übrigens lässt sich die Lib fehlerlos mit dem Lib-Manager compilieren.
Entweder findet dieser das Label oder es wird nicht geprüft.
Was ist da los?
Wo liegt der Fehler?
Benutze V2.0.8.3