[archimedes] Re: Fragen zum C-Programm Uhrzeit

  • From: Alexander Ausserstorfer <bavariasound@xxxxxxxxxxxxxxx>
  • To: archimedes@xxxxxxxxxxxxx
  • Date: Sat, 04 Mar 2017 08:28:06 +0100

In message <c771831756.cms@xxxxxxxxxxxxxxxxxxxxxx>
          Carlos Michael Santillan <ml-archimedes@xxxxxxxxxx> wrote:

Zusächlich ist die Methode irgendwelche Bytes in den Speicher zu
schreiben um das dann auszuführen nicht gerade transparent. Was macht
eigentlich der Wert 123 oder 85?

Hängt davon ab, was für eine Bedeutung der Wert hat.

Du musst halt das, was eigentlich ein Compiler macht, selbst im Kopf
durchführen. Hat man ja früher auch getan. Irgendwann ist man dann aber
hergegangen und hat statt dessen eine "Sprache" erfunden, die für
Menschen besser lesbar sein soll: Assembler. Der Compiler nudelt das
dann halt wieder in Maschinensprache um. Das heißt aber noch lange
nicht, dass man es deshalb nicht gleich selbst in Maschinensprache
machen kann. Ich hatte mal einen Computer da, der ließ sich gar nicht
anders programmieren als direkt in Maschinensprache.

Irgend jemand muss das auch machen. Weil irgend jemand ja die
Chip-Befehlsätze designen muss.

Da ist es besser Assembler zu benutzen das beim BBC BASIC schon
vorbereitet ist. In BASIC schreibst Du das ab der Adresse 49192. Das
kann man in C genauso und schon hast Du die Startadresse.

Du meinst, der _übersetzte_ C-Code wird dann an genau dieser Adresse
gestartet? Das glaube ich eher nicht. Siehe Text etwas später.

Mit DATA hinterlegt man die Dezimalwerte, welche ein Programm oder Daten
beschreiben, also z. B.

100 DATA 123, 85, 38, 3, 80, 89, ...

usw.

READ liest diese Daten nacheinander aus..

POKE schreibt Daten in den Speicher. PEEK liest Daten aus dem Speicher
aus.

Will man z. B. ab Adresse 49192 ein Programm oder Daten in den Speicher
klopfen, macht man folgendes:

10 FOR a = 49192 TO ...
20 READ d
30 POKE 49192 + a

Das sollte wohl nur a stehen. :-)

30 POKE 49192 + a, d

sollte da stehen.

40 NEXT a
100 DATA 123, 85, 38, 3, 80, 89, ...

BTW: Man muss für die FOR Schleife wissen wieviele Daten in DATA liegen.
Muss man bei C aber auch.

Das ist ohne Bedeutung.

Man könnte vielleicht hergehen und mit Hilfe von C einen Datenblock in
den Speicher klopfen, der Entsprechendes enthält (Code + Daten).

int a[2000];

a[0] = 123;
a[1] = 85;
[a2] = 38;

Das wäre eine Lösungsmöglichkeit. Ein Array ist nur einen andere
Schreibweise für Zeiger. Nebenbei gilt das auch für BASIC.

Dann weiß ich aber immer noch nicht, was der C-Compiler tatsächlich
macht. Denn vermutlich macht er mehr. Wo startet also das Programm? Und

Bei BASIC weiß ich es auch nicht.

Doch. Weil das Programm bei exakt der Speicherstelle anfängt, die man
angegeben hat. Wo aber fängt das _kompilierte_ C-Programm zu laufen an?

Wir reden hier scheinbar aneinander vorbei. Siehe später.

was ist mit der Main-Schleife (welche der Compiler anscheinend
blödsinnigerweise erwartet, obwohl die kein Mensch braucht, denn sonst
bricht er ab)? Die Main-Schleife ist auch ein Hauptproblem bei den
Modulen; denn diese kennen keine.

C Programme besteht aus Funktionen und main() ist halt die wo alles
anfängt. Das Module kein main() haben ist durchaus richtig. Es sind
keine Programme, sondern nur einen Samlung von Funktionen. Das
eingentliche Programm hat die Funktion main() und ruft die eine oder
andere Funktion aus dem einen oder anderen Modul auf.

Und genau deshalb sollte ein C-Compiler die Module unterstützen. Sonst
wird's haarig bzw. brauche ich den C-Compiler nicht. Wenn ich alles
irgendwie hinbiegen oder ihn austricksen muss, damit es überhaupt geht.

Wenn ich die Daten mit Hilfe von C in den Speicher klopfe, dann aber mit
Hilfe eines Editors wie StrongEd den übersetzten Code von überflüssigem
Zeug "bereinigen" muss, dann kann ich auch hergehen und den Code gleich
mit Hilfe von StrongEd direkt einklopfen. Das ist nicht sinnvoll.

Du meinst direkt Maschinensprache?

Also, um dir jetzt mal auf die Sprünge zu helfen:

In BASIC kann ich das Programm mittels

RUN

_direkt_ in den Speicher klopfen. Siehe von mir genannten Beispielcode.

In C muss ich aber erst ein Programm schreiben, das dann übersetzt _und
anschließend nochmals ausgeführt wird_, damit dann das eigentliche
Programm gesondert in den Speicher geschrieben wird. In BASIC geht das
aber direkt. Das ist der Unterschied.

Ich gehe aber stets davon aus, dass nach dem übersetzen bzw. Kompilieren
der eigentliche Code schon irgendwo im Speicher steht, ich aber nicht
weiß, wie ich an den vernünftig herankommen soll. Weil C halt den Rest
auch noch reinnuddelt.

Für sowas brauche ich dann aber kein C. Weil das mit anderen Werkzeugen
halt auch direkt und viel schneller geht. In BASIC ist das wenigstens
ein Schritt weniger.

Hoffe, das ist jetzt geklärt.

Weil ich nicht weiß, wie ich dort die entsprechenden
Programm-Bibliotheken nutzen kann. Neue Programm-Bibliotheken zu
portieren dürfte auch etwas schwierig sein. Die meisten Bibliotheken
sind leider nur im grauenhaften C-Quellcode verfügbar. Dies ist der
einzige Grund. Sonst würde ich mir C gar nicht erst antun.

Problem ist, dass man heutzutage nicht mehr alles neu schreibt, sondern
auf Bestehendes zurückgreifen muss. Weil man bei der Komplexität der
Programme sonst nicht mehr fertig wird. Siehe Webbrowser. Andernfalls
hätte ich auch !POP3S und !SMTPS nicht fertig gebracht.

Warum soll man auch immer wieder das Rad neu erfinden, wenn es schon
erfunden wurde. Warum schreibt nicht jeder für ein Programm ein neues
Betriebssystem?

Dafür müssen aber entsprechende Schnittstellen vorhanden sein. Und die
kenne ich für BBC BASIC eben nicht.

Zuerst fragst du mich, warum ich nicht besser BBC-BASIC verwende. Dann
meinst du wieder, dass nicht jeder das Rad neu erfinden soll.

*) Hinweis: Bei moderneren Betriebsystemen als das vom C64 kann man
nicht im gesamten Speicher lesen und schreiben.

Jow. Da sagt einem der Rechner, was man machen soll und darf. Habe ich
aba nicht so gerne... weil, ich bin ja ein Dickschädel. Und lasse mir
nicht gerne etwas sagen. Sondern möchte dem Rechner sagen, was er zu tun
hat.

Viel Spaß wenn Du in Deinen Programm in dem Speicher eines anderen
Programms rumschreibst. War das nicht das Problem von Windows bis Me?
Bei NT ging das nicht und schon war Windows stabiler - wenn auch immer
noch sch....

Das habe ich nicht gesagt. Ich habe nur gesagt, dass ich es nicht mag,
wenn mir jemand sagt, was ich tun muss und was ich nicht darf.

Das ist so ähnlich wie mit dem ganzen S#### 3D-CAD. Sobald du anfängst,
Zeichnungen zu machen, wirst du feststellen, dass man damit nicht
vernünftig professionelle Zeichnungen machen kann, weil die Software
eben dieses oder jenes nicht kann (= nicht zulässt). Das Zeichenbrett
kann da aber eben viel mehr; es schränkt mich nicht so sehr ein. Gut,
sicher ginge es fast immer irgendwie. Aber das sind dann sehr
aufwändige, d. h. zeitintensive Kunststücke. Und für sowas zahlt man
dann tausende von Euro. Ähem. Dafür brauche ich den ganzen Quatsch
nicht.

Viel Lärm um nichts. Und jetzt weiß ich immer noch nicht, wie ich mit
dem GCC vernünftig Module erstellen und dabei die entsprechenden
Libraries verwenden bzw. einbinden kann.

A.

-- 
http://home.chiemgau-net.de/ausserstorfer/
Frei. Wild. Südtirol.

Other related posts: