Assembler/C crossover

  • Themenstarter Themenstarter BassBox
  • Beginndatum Beginndatum
Das mit den Aufrufkonventionen?
Ja, warum nicht?

Etwas wichtiges muss man aber beachten: Klasseninterne Methoden haben eine eigene CC:
thiscall
Der Grund: Die Methoden werden zuerst unabhängig vom tatsächlichen Objekt kompiliert und bekommen dann beim Aufruf einen Pointer auf das betroffene Objekt als zusätzlichen "Parameter" mit.

thiscall ist zu allem Überfluss auch noch je nach Compiler anders.

Bei Visual Studio, wenn die Funktion eine fixe Parameteranzahl hat:
Wie stdcall, die Objektadresse muss aber vor dem Aufruf in ECX rein.

Bei Visual Studio, wenn die Funktion variable Parameterlistenlängen hat:
Wie cdecl die Objektadresse muss auch hier vor dem Aufruf in ECX rein.

Bei gcc:
Wie cdecl, die Adresse wird aber wie ein normaler Parameter mit den anderen in den Stack geschoben.
Und zwar als letztes push (bzw. im C++-Quelltext wäre das der erste Parameter).

Gruß
 
und per Inlineassembler? Gleich wie mit c oder? Ich habe gehört das man um globale vartiablen setzten zu können irgendwas einstellen musst. Ich nutze übrigen auch in diesem Fall den Turbo C(++). Hat eigentlich jeder Hochsprachen Compiler einen Inline Assembler?
Könnte ich dann auch rein theorethisch in Java weier schreiben? Ich habe nach geguckt: der Inlineassembler vom TC heist BASM
vielen Dank für deine Hilfe
Lg
BassBox
 
Zuletzt bearbeitet von einem Moderator:
und per Inlineassembler? Gleich wie mit c oder?
Ja.

Ich habe gehört das man um globale vartiablen setzten zu können irgendwas einstellen musst.
Keine Ahnung. Bei Visual Studio gehts jedenfalls ohne zusätzliche Einstellungen.

Hat eigentlich jeder Hochsprachen Compiler einen Inline Assembler?
Die mir bekannten C/C++-Compiler alle. Vielleicht schreibt es ja auch der Sprachstandard vor...
Aber jede Hochsprache generell? Nein.
zB Bei solchen Halb-Interpretersprachen wie C# und Java würde das überhaupt keinen Sinn machen.
Die haben ja eigene Exe-Formate, in denen keine direkten Prozessorbefehle vorkommen.
Wohin also mit dem übersetzten Assemblerteil?

Könnte ich dann auch rein theorethisch in Java weier schreiben?
Du könntest Inline-Asm in einer C-DLL machen und diese per JNI/JNA in Java verwenden.

Ich habe nach geguckt: der Inlineassembler vom TC Geist BASM
Das B steht wahrscheinlich für Borland.

Gruß
 
Danke! Gut ich habe noch eine Frage. Um mir die mühe und dem Umweg mit dem Linker zu ersparen kann ich das zeugs nich einfach ganz normal zu exe machen und das programm dann mit einem Jump oder Call starten? Ich weis nicht genau ob exe gleich funktioniert wie binary oder noch einen header hat.
Hast du Zufällig ahnung davon? Wäre nämlich besser das zeugs zu exe zu machen und dann zu starten als noch über umwege zu linken. Ich würde das starten nähmlich lieber dem OS überlassen (ist Praktischer und das programm wird unwesentlich kleiner).(hat leder nicht viel mit dem thema zu tun aber ich wills trotztdem wissen) Und Weist du ob die Dos interupts (realmode) auch unterwindows 32bit in der IDT eingetragen sind? Und ob es irgendwo im netzt eine tabelle mit den windows idt interrupts gibt? (ich versuche mein OS linux und Windows Kompartibel zu halten)
LG
BassBox
 
Zuletzt bearbeitet von einem Moderator:
Zu Exe machen kannst du schon, aber auch ein ganz normales Hello-World-Programm unter Windows wird gelinkt.
Hier die "normalen" Parameter, die VS unter 32bit-XP bei mir für ein Konsolenprogramm nimmt:
Code:
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"Release/prog.pdb" /machine:I386 /out:"Release/prog.exe"
Also ziemlich viele Standardlibrarys von Windows mit drin.
Alle werden vielleicht nicht gebraucht, aber wenn du eine Standard-Exe von Windows starten können willst, musst du die Funktionen alle zur Verfügung stellen.

Und ja, eine Exe hat auch ihr eigenes Format. Wie das aufgebaut ist, kann man schnell im Internet finden.

Gruß
 
Also ich möchte exe nur verwenden da ich mir sparen will irgendwelche eigenen compiler zusammenschrauben will sonderen das es für den programmiere leicht sen soll schnell einen ausführbare datei zu bekommen. Wie entfernt man die windows bibliotheken aus der exe? Bzw wie verhindert mann das sie eingebunden werden? Und nein ich werde noch keine Windows-Funktionen Definiren sonderen es so machen: Man includiert die datei OS.h in welcher Die befehle mit assembler Definiert sind (natürlich unter nutztung von Pmode Interruptions). Man schreibt ein Programm mit den Definierten Befehlen von der OS.h compiliert das und startet es dann unter meinem eigenem os. Die datei soll ohne windowsfunktionen verwendet werden . Ich habe mir hier angeguckt wie exe aufgebaut ist, aber ich check jetzt nicht welche tabelle wo hingehört und wo die jetzt zu finden ist.
Danke für deine Hilfe und unterstütztung
LG
BassBox
 
Zuletzt bearbeitet von einem Moderator:
Libs entfernen: Je nach Linker durch CMD-Parameter.
1) Einfach keine Extra-libs angeben
2) Ggf. je nach Linker einen Parameter, dass keine Standardlibs verwendet werden sollen.

Bei Projekten von grafischen IDEs wird die Kommandozeile automatisch mitgeneriert, muss dann in den Projekteinstellungen nachträglich angepasst werden.

Bei Winprogs wirst du allerdings Probleme bekommen.
Ohne min. die kernel32.dll läuft nichts. Auch kein Linker.
Grund: Der Einstiegspunkt/Startpunkt eines Windows-Programms ist in Wirklichkeit nicht main, sondern eine interne Funktion aus der kernel.dll.
Ohne die und ihren Einstiegspunkt linkt überhaupt nichts.

Zumindest die Grundzüge der Windows-Prozessverwaltung wirst du implementieren müssen, wenn du nicht schon abgeschreckt bist.

Zum EXE-/PE-Format: Den "ToDo´s" zufolge ist der Artikel auf der Lowlevelseite unvollständig.
Warum nicht gleich die offizielle Spec?
http://msdn.microsoft.com/en-us/windows/hardware/gg463119.aspx
Nach dem Zustimmen zur Lizenz bekommt man eine docx-Datei.

Gruß
 
ok. Weist du was ich mache das jetzt so: ich nehme jetzt den binary linker und bastle mir ein eigenes executables dateformat. Und um den einstuegspunkt zu kriegen bastle ich mir ne eigene Lib zusammen die ich dann nutze anstatt der von Windows um den einstuegspunkt zu kriegen. Bei der Nächsten Version meines OS befasse ich mich ernsthaft mit der kompatibilität zu Microsoft Programmen. Setzt der TC beim Installieren irgendwelch Reg Einträge? Ich will den zu nem eigenem installet umbauen. (darf ich ja weil das Copyright ausgelaufen ist und Borland zwischendurch pleite gegangen ist.)
LG
Danke für deine Unterstütztung
BassBox
 
"Binary Linker"? Nie gehört.
Und denkst du nicht, dass der mit einem eigenen Format nicht zurecht kommen wird?


Zu den TC-Reg-Einträgen: Denk schon. Warum schaust du nicht nach?
Und Borland ist doch von irgendwem übernommen worden?
Ich glaube nicht, dass das CRight automatisch weg ist.

Gruß
 
Zuletzt bearbeitet:
Ich meine Das Anderst: Ich nehme einen linker der zu bin linkt. Ich habe das jetzt so:
kernel.c wird mit einer obj datei zusammen gelinkt die eine externe Main Funktion aufruft:
Code:
[Bits 32] 		
extern _main 	;definiert externe main funktion
global start 	;globale startmarke
start:
call _main 	    ;rufe die main funktion in c kernel auf.
int 17h         ;springe zurück (system eigene funktion)

Da die beiden Programme noch objekt dateien sind, sind die globalen labels noch verfügbar.
Das funktioniert jetzt einwand frei.

Ich verwende jtzt den Djgpp den ich dan als paket an meine freunde gebe, mit nem installer Batch sktipt welches dan auch meine headder und linker skripte mitgibt.
Dane für deine Hilfe
BassBox
 
Zurück