amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Initialisierung SysBase? [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

12.08.2002, 14:20 Uhr

tokai
Posts: 1071
Nutzer
Hallo,

ist es eigentlich bei Programmen, die man ohne startup (c.o o.ä.) linkt, nötig die SysBase zu initialisieren? Das Programm läuft ohne und mit der Initialisierung (auch bei Zugriffen auf Funktionen der exec.library)...

Codeschnippsel:
.... 8<

struct ExecBase *SysBase;

long __saveds main(void)
{
SysBase = *(struct ExecBase **)4;

.... 8<

tokai




[ Dieser Beitrag wurde von tokai am 12.08.2002 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

13.08.2002, 11:42 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Original von tokai:
ist es eigentlich bei Programmen, die man ohne startup (c.o o.ä.) linkt, nötig die SysBase zu initialisieren? Das Programm läuft ohne und mit der Initialisierung (auch bei Zugriffen auf Funktionen der exec.library)...

Du verwechselst da wohl etwas. Programme ohne Startup müssen SysBase initialisieren (was soll das Programm ansonsten sinnvolles tun können?

Zitat:
struct ExecBase *SysBase;

long __saveds main(void)
{
SysBase = *(struct ExecBase **)4;


Wenn Du Startupcode verwendest, ist die Zeile mit SysBase überflüssig.
Wenns ohne die Zeile läuft, dann verwendest Du auch Startupcode, da sonst Dein Programm einen Absturz produzieren müsste.

[ - Antworten - Zitieren - Direktlink - ]

13.08.2002, 15:02 Uhr

tokai
Posts: 1071
Nutzer
Zitat:
Original von gni:
Du verwechselst da wohl etwas. Programme ohne Startup müssen SysBase initialisieren (was soll das Programm ansonsten sinnvolles tun können?


Ich verwechsle nichts. :)

Bei den SAS/C Beispielen ist z.B.: auch ein HelloWorld-Replacement ohne SysBase Initialisierung und das Beispiel wird ohne startup gelinkt (Linker options: nostartup, "slink from test.o to test.exe SMALLCODE SMALLDATA")

sieht wie folgt aus:

---- 8< ----

#include <stdlib>

#define MSG "hello world!\n";

int __saveds main(void)
{
struct DosLibrary *DOSBase = (struct Doslibrary *)OpenLibrary("dos.library",0L);

Write(Output(),MSG,strlen(MSG));

Close((struct DosLibrary *)DOSBase);
}

---- 8< ----

funktioniert auch. Ohne SysBase Initialiserung.


Zitat:
Original von gni:
Wenn Du Startupcode verwendest, ist die Zeile mit SysBase überflüssig.
Wenns ohne die Zeile läuft, dann verwendest Du auch Startupcode, da sonst Dein Programm einen Absturz produzieren müsste.


s.o.

Habe hier ein Tool geschrieben, dass ohne startup gelinkt wird. Das Tool öffnet nur dos.library und verwendet deren Funktionen. Es werden auch exec.library-Funktionen wie z.B. AllocVec() verwendet. Und OpenLibrary() natürlich :) Läuft wunderbar ohne und mit der SysBase-Initialisierung. Lässt man die SysBase-Initialisierung weg kann man sogar noch einige Bytes (Programmesgrösse) sparen.

tokai.


[ Dieser Beitrag wurde von tokai am 13.08.2002 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

13.08.2002, 18:38 Uhr

thomas
Posts: 7675
Nutzer

Warum fragst du, wenn du es schon weißt ? Wenn Exec-Funktionen funktionieren, wird auch SysBase initialisiert. Du kannst SysBase ja extern deklarieren und nachsehen, was drinsteht.

Um ganz sicherzugehen mußt du das Lademodul disassemblieren.

Gruß Thomas



--
Email: thomas-rapp@web.de

Home: home.t-online.de/home/thomas-rapp/


[ - Antworten - Zitieren - Direktlink - ]

14.08.2002, 09:43 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Ich verwechsle nichts. :)

Stimmt. Standardmäßig verwendet SAS/C SysBase nicht... Aus Kompatibilitätsgründen wird AbsExecBase verwendet. Wenn man proto/exec.h verwendet und SysBase will, muß man __USE_SYSBASE definieren. Das kann man sich alles im proto/ Header anschauen.
AbsExecBase sollte man tunlichst vermeiden. Man bekommt sonst Beschwerden von Leuten die ständig Enforcer-Tools laufen haben ;-)

[ - Antworten - Zitieren - Direktlink - ]

15.08.2002, 09:59 Uhr

tokai
Posts: 1071
Nutzer
Zitat:
Original von gni:
Stimmt. Standardmäßig verwendet SAS/C SysBase nicht... Aus Kompatibilitätsgründen wird AbsExecBase verwendet. Wenn man proto/exec.h verwendet und SysBase will, muß man __USE_SYSBASE definieren. Das kann man sich alles im proto/ Header anschauen.
AbsExecBase sollte man tunlichst vermeiden. Man bekommt sonst Beschwerden von Leuten die ständig Enforcer-Tools laufen haben ;-)


Das stimmt. Aber praktisch bringt das auch keinen Unterschied. Aber ich vermute, dass das ganze über amiga.lib initialisiert wird, anders kann ich mir das auch nicht mehr erklären... bin leider noch nicht dazu gekommen, die amiga.lib macros aus dem Tool rauszunehmen. Das werd' ich nochmal probieren, vielleicht bringt es die Lösung, wenn ich das ganze ohne die amiga.lib linke.



Hmmm... eigentlich funktioniert das Tool ja... aber es ist einfach mal interessant sowas herauszufinden! :)



[ - Antworten - Zitieren - Direktlink - ]

15.08.2002, 20:49 Uhr

Holger
Posts: 8090
Nutzer
Zitat:
Original von gni:
AbsExecBase sollte man tunlichst vermeiden. Man bekommt sonst Beschwerden von Leuten die ständig Enforcer-Tools laufen haben ;-)

Ich dachte, Enforcer würde die AbsExecBase aus einem ziemlich naheliegenden Grund nicht als illegalen Zugriff melden.
Aber es gibt einen anderen Grund AbsExecBase zu vermeiden. Die Adresse liegt im Chip-RAM und abhängig davon, wie viele exec-Funktionen man benutzt, kann sich der Geschwindigkeitsunterschied durchaus bemerkbar machen.

mfg

--

Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

20.08.2002, 15:17 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Aber praktisch bringt das auch keinen Unterschied.
Zwischen _SysBase und _AbsExecBase besteht ein großer Unterschied!
Zitat:
Aber ich vermute, dass das ganze über amiga.lib initialisiert wird, anders kann ich mir das auch nicht mehr erklären...
Die amiga.lib hat damit *nichts* zu tun. Wenn _AbsExecBase verwendet wird, dann generiert der SAS/C folgenden Code:

move.l 4,a6

Wenn man __USE_SYSBASE definiert, dann muß man _SysBase initialisieren, weil der Compiler dann folgenden Code generiert:

move.l _SysBase,a6

Alles klar?


[ - Antworten - Zitieren - Direktlink - ]

20.08.2002, 15:20 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Original von Holger:
Zitat:
Original von gni:
AbsExecBase sollte man tunlichst vermeiden. Man bekommt sonst Beschwerden von Leuten die ständig Enforcer-Tools laufen haben ;-)

Ich dachte, Enforcer würde die AbsExecBase aus einem ziemlich naheliegenden Grund nicht als illegalen Zugriff melden.
Tut er auch nicht. Aber da Enforcer den Zugriff emulieren muß, wird es langsam. Das fällt dann eben auf, wenn viele Zugriffe auf _AbsExecBase erfolgen.
Zitat:
Aber es gibt einen anderen Grund AbsExecBase zu vermeiden. Die Adresse liegt im Chip-RAM und abhängig davon, wie viele exec-Funktionen man benutzt, kann sich der Geschwindigkeitsunterschied durchaus bemerkbar machen.
Nicht unbdingt. MMU-Amigas mappen die Zero-Page einfach ins Fast-Ram ;-)

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Initialisierung SysBase? [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2022 by amiga-news.de - alle Rechte vorbehalten.
.