Umgebung für Assembler ?

Hallo
Ich habe mal Fragen an C Programmierer .
In welchem Umfang wird bei C Inline-Assembler benutzt , und in welchem Umfang werden hierfür externe Assembler benutzt ( Masm ) ?
Hätte ein kontextsensitiver Editor für Assembler einen Sinn ?
Werden bei C Programmieren Include-files für Assembler verwendet ?
Bei Microsoft gibt es dem Masm nur noch als Zugabe für Visual C++ . Anscheinend soll Assembler sterben , und auch die Betriebssysteme werden zum großen Teil mit C erstellt .

Kann jemand mir etwas schlaues mitteilen ?
MfG
Matthias

Hallo Matthias

Ich habe mal Fragen an C Programmierer .
In welchem Umfang wird bei C Inline-Assembler benutzt , und in
welchem Umfang werden hierfür externe Assembler benutzt ( Masm
) ?
Hätte ein kontextsensitiver Editor für Assembler einen Sinn ?

Du musst hier zuerst einmal zwischen System- und Applikations-Programmierung unterscheiden:

System:
(Hierzu gehören auch Teile der Laufzeitbibliothek, Hardwaretreiber und das BS, auch das Programmieren von Ein-Chip-Prozessoren gehört dazu).
Hier gibt es einige Dinge welche NUR in Assembler möglich sind z.B.

  1. Die CSTARTUP-Datei welche den Programm-Speicher (Variablen) und die Standart Ein/Ausgabe für das C-Programm initialisiert.
  2. Das Sichern aller Register und Laden der gespeicherten bei einem Taskwechsel
  3. Compiler-Hilfsfunktionen für Long-Arithmetik und Floatingpoint (entweder Emulation oder Ansteuerung der FPU).
  4. Laufzeitoptimierung einfacher Bibliotheksfunktionen.

Applikation:
Hier sollte man dem Applikations-Programmierer Berufsverbot erteilen WEIL er so etwas macht, oder dem Compiler-Programmierer weil er es NICHT gemacht hat !

Inline-Code:
Ist eine ziemliche Bastelei, welche eigentlich nur Probleme verursacht:
Wenn man die Assemblersprache, die Segmentierung und den Linker nicht beherscht, sollte man die Finger davon lassen;
Die Funktion ist nicht optimierbar;
Der Code ist nicht auf einen anderen Compiler portierbar;
In einer Multitasking-Umgebung sind direkte Speicher- oder I/O-Zugriffe sowieso nicht gestattet.

„richtiger Assembler“:
Wenn du ein Modul in Assembler erstellst, ist es aus der Sicht des C-Compilers nicht von einem Modul welches in C geschrieben wurde zu unterscheiden.

Bei Microsoft gibt es dem Masm nur noch als Zugabe für Visual
C++ . Anscheinend soll Assembler sterben , und auch die
Betriebssysteme werden zum großen Teil mit C erstellt .

Wie weiter oben schon gesagt, ist Assembler etwas für die Profis und somit macht es auch Sinn den Assembler nur mit der Profiversion auszuliefern.

Werden bei C Programmieren Include-files für Assembler
verwendet ?

Diese Frage verstehe ich nicht ? Meinst du ob Include-Dateien auch in einem Assembler-Programm verwendet werden oder ob eine Include-Dateie für ein in Assembler geschriebenes Modul erstellt wird ??

MfG Peter(TOO)

Applikation:
Hier sollte man dem Applikations-Programmierer Berufsverbot
erteilen WEIL er so etwas macht, oder dem
Compiler-Programmierer weil er es NICHT gemacht hat !

Hier fände ich einen kontextsensitiven Editor gut , das es etwas einfacher wird und komplette Anwendungen auch in Assembler schreiben kann . Ich habe ein vb5.Professionell und masm 6.11(mit update6.13) , ich kann mit Assembler dll´s schreiben ( nach vielen Fehlern ) …
Den Systemcode wollte ich eigentlich nicht verändern , bei Microsoft stellen die mich dafür im Leben nicht ein …

Inline-Code:
Ist eine ziemliche Bastelei, welche eigentlich nur Probleme
verursacht:
Wenn man die Assemblersprache, die Segmentierung und den
Linker nicht beherscht, sollte man die Finger davon lassen;

Ja , der Linker war irgendwie mangelhaft dokumentiert , ich mußte mir was aus dem Internet laden . Die Segmentierung ist heute bei win32 überfällig . (flat32)Bereitet mir leichtes Grausen .

Die Funktion ist nicht optimierbar;

?? welche ?

Der Code ist nicht auf einen anderen Compiler portierbar;
In einer Multitasking-Umgebung sind direkte Speicher- oder
I/O-Zugriffe sowieso nicht gestattet.

Das sind aber auch Eigenschaften des protected-mode , multitasking hin oder her .

„richtiger Assembler“:
Wenn du ein Modul in Assembler erstellst, ist es aus der Sicht
des C-Compilers nicht von einem Modul welches in C geschrieben
wurde zu unterscheiden.

Danke , ich hoffe Du meinst .dll´s

Bei Microsoft gibt es dem Masm nur noch als Zugabe für Visual
C++ . Anscheinend soll Assembler sterben , und auch die
Betriebssysteme werden zum großen Teil mit C erstellt .

Wie weiter oben schon gesagt, ist Assembler etwas für die
Profis und somit macht es auch Sinn den Assembler nur mit der
Profiversion auszuliefern.

Ja kann sein , aber ich glaube eher , das man Beratungszwänge bei Microsoft oder hilflose,bzw. „unproduktive“ Programmierer vermeiden möchte . Ich bin zum Beispiel echt sauer , das manche Sachen im Windows nicht schneller gehen (windows scrollen , Grafik-api )

Werden bei C Programmieren Include-files für Assembler
verwendet ?

Diese Frage verstehe ich nicht ? Meinst du ob Include-Dateien
auch in einem Assembler-Programm verwendet werden oder ob eine
Include-Dateie für ein in Assembler geschriebenes Modul
erstellt wird ??

Die Frage hat sich etwas erledigt , die C- Programmierer haben ja diese .H Files und ähnliches ( bin nicht sehr bei C bewandert ) , das .inc Files in Assembler verwendet werden , weiß ich so , außerdem Tippfehler: „bitte C Programmierern“ .

MfG Peter(TOO)

MfG Matthias

Hallo Matthias

Applikation:
Hier sollte man dem Applikations-Programmierer Berufsverbot
erteilen WEIL er so etwas macht, oder dem
Compiler-Programmierer weil er es NICHT gemacht hat !

Hier fände ich einen kontextsensitiven Editor gut , das es
etwas einfacher wird und komplette Anwendungen auch in
Assembler schreiben kann . Ich habe ein vb5.Professionell und
masm 6.11(mit update6.13) , ich kann mit Assembler dll´s
schreiben ( nach vielen Fehlern ) …
Den Systemcode wollte ich eigentlich nicht verändern , bei
Microsoft stellen die mich dafür im Leben nicht ein …

Die heutigen, optimierenden, C-Compiler erzeugen sehr effizienten Code, welcher nur unwesentlich langsamer als ein entsprechendes Assembler-Programm ist. Wenn du die Zeit berechnest welche du benötigst um ein Programm zu schreiben und zu debuggen welches dann ca 5-10% schneller läuft, rechnet sich die Entwicklung in Assembler nicht !

Inline-Code:
Ist eine ziemliche Bastelei, welche eigentlich nur Probleme
verursacht:
Wenn man die Assemblersprache, die Segmentierung und den
Linker nicht beherscht, sollte man die Finger davon lassen;

Ja , der Linker war irgendwie mangelhaft dokumentiert , ich
mußte mir was aus dem Internet laden . Die Segmentierung ist
heute bei win32 überfällig . (flat32)Bereitet mir leichtes
Grausen .

Ich meine hier nicht die Segmentierung (Speicherverwaltung) der CPU, sondern die Segmentierung des Programmcodes also des Speichersegments in welchem der Code abgelegt (sollte ReadOnly gesetzt werden und muss vom Betriebssystem nicht ausgelagert werden wenn Platz im Hauptspeicher benötigt wird, sondern kann aus der Programm-Datei nachgeladen werden), das Segment in welchem Konstanten abgelegt werden (wird wie das Code-Segment behandelt) und das Segment in welchem sich die Daten befinden (dieses MUSS ausgelagert werden, wenn im Hauptspeicher Platz benötigt wird). Dann ist da noch das „kleine“ Problem, welches die meisten Programmierer nicht beherschen, dass die Routine welche zum „Aufräumen“ einer DLL benötigt wird immer im SPeicher gehalten werden muss, sonsst kann man das Programm nicht mehr beenden wenn der Speicher voll ist.

Die Funktion ist nicht optimierbar;

?? welche ?

Normalerweise optimiert ein Compiler die Belegung der CPU-Register mit lokalen Variablen und Schleiffen werden auch umgestellt so, dass sie schneller abgearbeitet werden können. Ist nun auch nur eine Zeile Inline-Assembler innerhalb einer Funktion vorhanden, so müssen diese Optimierungen abgeschaltet werden.

Der Code ist nicht auf einen anderen Compiler portierbar;
In einer Multitasking-Umgebung sind direkte Speicher- oder
I/O-Zugriffe sowieso nicht gestattet.

Das sind aber auch Eigenschaften des protected-mode ,
multitasking hin oder her .

Zu zäummst hier das Pferd am Schwanz auf.
Der Protectet-Mode wurde von Intel beim 80286 eingeführt um Tasks voneinander zu trennen, das heisst ein Task kann nicht auf den Code- oder Daten-Bereich eines anderen zugreiffen und dort versehentlich (Hacker machen es mit absicht) etwas zu verändern (Andere CPU’s, insbesondere Grossrechner konnten das schon länge). Microsoft hat das nur bei Windows NT richtig implementiert, bei Win95/98 ist diese Trennung nur mangelhaft implementiert.

„richtiger Assembler“:
Wenn du ein Modul in Assembler erstellst, ist es aus der Sicht
des C-Compilers nicht von einem Modul welches in C geschrieben
wurde zu unterscheiden.

Danke , ich hoffe Du meinst .dll´s

Eigentlich nicht nur. Wie der Name schon sagt (DLL = Dynamic Link Library) ist das eigentlich eine normale Bibliothek, oder eben ein Modul, welches erst, wenn es zur Laufzeit wirklich benötigt, geladen wird. Das gegenteil ist eine statisch gelinkte Bibliothek, welche dann meist direkt in deiner EXE-Datei abgelegt wird. Der Vorteil einer DLL ist, dass sie nur einmal im System (auf der Disk) abgelegt werden muss und dann von allen Programmen benutzt werden kann und somit PLatz gespart werden kann, Das ganze wird mit etwas mehr Zeit für jeden Aufruf der Funktionen erkauft, da im Programm-Code nicht feste Sprungadrssen abgelegt werden können. Zudem kann es Probleme geben wenn eine DLL dur eine andere Version ersetzt wird, welche nicht ganz kompatibel zur bestenden ist, dann funktionieren plötzlich alle Programme die diese DLL verwenden nicht mehr richtig.
Module bedeutet auch, dass ich mein Programm (Source Code) NICHT in eine einzige Datei packe, sondern in einzelne Teile gruppiere, welche dann auch einzeln Compiliert werden können. Einerseits spart man sich damit Zeit beim Compilieren (es müssen nur diejenigen Module neu compiliert werden, welche verändert wurden) andererseits erreicht man eine gewisse Kapselung (lokale Funktionen und Daten können von ausserhalb nicht aufgerufen werden und man ändert nicht etwas, was dann ausserhalb des Moduls zu Problemen führt).

Bei Microsoft gibt es dem Masm nur noch als Zugabe für Visual
C++ . Anscheinend soll Assembler sterben , und auch die
Betriebssysteme werden zum großen Teil mit C erstellt .

Wie weiter oben schon gesagt, ist Assembler etwas für die
Profis und somit macht es auch Sinn den Assembler nur mit der
Profiversion auszuliefern.

Ja kann sein , aber ich glaube eher , das man Beratungszwänge
bei Microsoft oder hilflose,bzw. „unproduktive“ Programmierer
vermeiden möchte . Ich bin zum Beispiel echt sauer , das
manche Sachen im Windows nicht schneller gehen (windows
scrollen , Grafik-api )

Das liegt vor allen daran, dass Microsoft eigentlich kein Ahnung von Betriebssystemen hat:
der Source-Code für MS-DOS wurde eingekauft und dann hat man nur daran rumgebastelt bis zu WIN 98.
Für Win NT hat man eine Betriebssystem-Entwickler-Mannschaft, die waren vorher bei DEC wenn ich mich recht erinnere, abgeworben.
Schau dir mal andere Betriebssysteme an welche auch auf deiner Hardware laufen, die sind kleiner, schneller und stabiler.

Werden bei C Programmieren Include-files für Assembler
verwendet ?

Diese Frage verstehe ich nicht ? Meinst du ob Include-Dateien
auch in einem Assembler-Programm verwendet werden oder ob eine
Include-Dateie für ein in Assembler geschriebenes Modul
erstellt wird ??

Die Frage hat sich etwas erledigt , die C- Programmierer haben
ja diese .H Files und ähnliches ( bin nicht sehr bei C
bewandert ) , das .inc Files in Assembler verwendet werden ,
weiß ich so , außerdem Tippfehler: „bitte C Programmierern“ .

In C gibt es im Prinzip 3 Arten der Verwendung von .H (H = Header) Dateien:

  1. Man definiert darin die öffentlichen Funktionsaufrufe, Konstanten und Datenstrukturen für ein bestimmtes Modul. Dadurch kann der Compiler diese überprüffen.
  2. Man definiert darin Macros, Konstanten und Datenstrukturen damit man die nicht immer wieder neu eintippen muss und man hat dadurch nur eine Datei in welcher man anpassungen vornehmen muss.
  3. Man kann damit Code-Fragmente in eine Funktion einsetzten.

Im Prinzip ist es genau das gleiche was du schon von deinen .INC-Dateien kennst.

MfG Peter(TOO)

Hallo , mir ist noch was eingefallen :

Die heutigen, optimierenden, C-Compiler erzeugen sehr
effizienten Code, welcher nur unwesentlich langsamer als ein
entsprechendes Assembler-Programm ist. Wenn du die Zeit
berechnest welche du benötigst um ein Programm zu schreiben
und zu debuggen welches dann ca 5-10% schneller läuft, rechnet
sich die Entwicklung in Assembler nicht !

Nee , das glaub ich aber nicht , diese C-Programme bekommt man auf beinah doppelte Geschwindigkeit , auch nach Microsoft Werbung . Auf diverse Möglichkeiten innerhalb der Maschinensprache möchte ich nicht eingehen .

Ich meine hier nicht die Segmentierung (Speicherverwaltung)
der CPU, sondern die Segmentierung des Programmcodes also des
Speichersegments in welchem der Code abgelegt (sollte ReadOnly
gesetzt werden und muss vom Betriebssystem nicht ausgelagert
werden wenn Platz im Hauptspeicher benötigt wird, sondern kann
aus der Programm-Datei nachgeladen werden), das Segment in
welchem Konstanten abgelegt werden (wird wie das Code-Segment
behandelt) und das Segment in welchem sich die Daten befinden
(dieses MUSS ausgelagert werden, wenn im Hauptspeicher Platz
benötigt wird). Dann ist da noch das „kleine“ Problem, welches
die meisten Programmierer nicht beherschen, dass die Routine
welche zum „Aufräumen“ einer DLL benötigt wird immer im
SPeicher gehalten werden muss, sonsst kann man das Programm
nicht mehr beenden wenn der Speicher voll ist.

Die verschieden Modes für Speicherbereiche , read-only usw. , das geht bei masm 6.10 und aufwärts automatisch , da kann es Unterschiede geben , und man kann das auch beeinflussen .
Man kann auch irgenwie locale und andere(Public bei Visual-Basic) Variablen verwenden , muß ich nachschlagen .
Als Hilfsmittel wird das MSDN empfohlen , auch was das Laden und entladen von .dlls und anderem betrifft .

Die Funktion ist nicht optimierbar;

?? welche ?

Normalerweise optimiert ein Compiler die Belegung der
CPU-Register mit lokalen Variablen und Schleiffen werden auch
umgestellt so, dass sie schneller abgearbeitet werden können.
Ist nun auch nur eine Zeile Inline-Assembler innerhalb einer
Funktion vorhanden, so müssen diese Optimierungen abgeschaltet
werden.

Ich würde es sowieso nur mit ganzen Funktionen in Assembler versuchen , Bastelei hat da wohl kaum Sinn .
Und wie ist es , wenn man ein externes Modul verwendet ? Dann müßte man nur die C Aufrufkonvention befolgen .LinkerOption

Der Code ist nicht auf einen anderen Compiler portierbar;

Die Linkeroptionen erlauben eine Portierung von Assembler zum Beispiel auf Windows CE-Computer "ARM-CPU , H3 ". Hier wird man ein Assembler Programm als sehr sinnvoll betrachten , da es klein sein kann .

MfG
Matthias

Hallo Matthias

Die heutigen, optimierenden, C-Compiler erzeugen sehr
effizienten Code, welcher nur unwesentlich langsamer als ein
entsprechendes Assembler-Programm ist. Wenn du die Zeit
berechnest welche du benötigst um ein Programm zu schreiben
und zu debuggen welches dann ca 5-10% schneller läuft, rechnet
sich die Entwicklung in Assembler nicht !

Nee , das glaub ich aber nicht , diese C-Programme bekommt man
auf beinah doppelte Geschwindigkeit , auch nach Microsoft
Werbung . Auf diverse Möglichkeiten innerhalb der
Maschinensprache möchte ich nicht eingehen .

Also Microsoft ist ja sicher nicht das Mass aller Dinge, schau dir z.B. mal den Code welcher Borland oder erst recht das was ein Watcom- oder Intel-Compiler erzeugt an!
Ich entwickle hauptsächlich Systeme, Steuerungen welche in Echtzeit arbeiten müssen, Enwicklungswerzeuge wie Debugger und ein eigenes Betriebssystem, mit der Hitachi H8-Familie und der IAR-Compiler erzeugt, bezogen auf Codegrösse und Geschwindigkeit, Code welcher wirklich nur um 5-10% schlechter ist als mein Assembler (es gibt da wirklich wenige Dinge die ich wesentlich besser kann)!

Die verschieden Modes für Speicherbereiche , read-only usw. ,
das geht bei masm 6.10 und aufwärts automatisch , da kann es
Unterschiede geben , und man kann das auch beeinflussen .
Man kann auch irgenwie locale und andere(Public bei
Visual-Basic) Variablen verwenden , muß ich nachschlagen .
Als Hilfsmittel wird das MSDN empfohlen , auch was das Laden
und entladen von .dlls und anderem betrifft .

Klar geht das! Ein C-Compiler kann ja nur Assembler-Befehle erzeugen, etwas anderes versteht ja die CPU gar nicht.

Die Funktion ist nicht optimierbar;

?? welche ?

Normalerweise optimiert ein Compiler die Belegung der
CPU-Register mit lokalen Variablen und Schleiffen werden auch
umgestellt so, dass sie schneller abgearbeitet werden können.
Ist nun auch nur eine Zeile Inline-Assembler innerhalb einer
Funktion vorhanden, so müssen diese Optimierungen abgeschaltet
werden.

Ich würde es sowieso nur mit ganzen Funktionen in Assembler
versuchen , Bastelei hat da wohl kaum Sinn .
Und wie ist es , wenn man ein externes Modul verwendet ? Dann
müßte man nur die C Aufrufkonvention befolgen .LinkerOption

Wie schon gesagt, wenn du dich an die Aufrufkonventionen hälst, dann kann der Linker gar nict unterscheiden ob’s C, Assembler oder sonst was war.

Der Code ist nicht auf einen anderen Compiler portierbar;

Die Linkeroptionen erlauben eine Portierung von Assembler zum
Beispiel auf Windows CE-Computer "ARM-CPU , H3 ". Hier wird
man ein Assembler Programm als sehr sinnvoll betrachten , da
es klein sein kann .

Also ein Intel x86- und ein SH3-CPU, haben nun mal eine ganz andere Architektur (Die ARM-CPU kenne ich nicht im Detail, ist aber auch ein RISC-Processor), einen anderen Befehlssatz (z.B. ist der RETURN-Befehl immer der 2. letzte Befehl in einer Soubroutine, um Zeit für die decodierung zu gewinnen, der auf den RETURN-Befehl folgende Befehl wird in jedem Fall ausgeführt) und der Register-Satz ist auch sehr verschieden. Wenn du deinen X86 Assembler auf einen SH3 „portierst“, dann wird in Wirklichkeit der X86 auf einem Interpreter abgearbeitet welcher den X86 emuliert. Das ist dann sicher nicht das Optimum!

MfG Peter(TOO)