Assembler und seine Stärken



  • Hoi alle zusammen

    Ich beschäftige mich nun seit 2 Wochen mit Assembler und muss sagen, dass
    es mein Grundverständniss über den Computer enorm gesteigert hat.
    Nun musste ich aber leider folgendes festellen.
    Ein sehr großes Pro-Argument um einen Assembler zu benutzen war für mich
    eg immer, dass man damit Betriebssysteme proggen kann und sehr sehr nah
    an der Hardware ist. Aber irgendwie fange ich an daran zu zweifeln.
    Insgesamt habe ich mir 5 Bücher über Assembler beschafft(aus Bücherrei
    usw) und in allen wird zwar immer gesagt "Assembler ist zwar gut und
    schön, aber eg kann man auch C benutzen da die heutigen PC schnell genug
    sind". Gut, dachte ich mir, kann ja sein, aber dann ist mir aufgefallen,
    dasss die Bücher 15-4 Jahre alt sind und mit "heutigen PCs" 10-33 Mhz
    Rechner gemeint sind. Wenn es früher schon mehr oder weniger egal war ob
    man C oder Assembler benutzt, wie ist es dann heute??
    Desweiteren habe ich kein einziges Gebiet gefunden, in dem man einen
    Assembler bevorzugt nutzt.
    Viele haben mir immer erzählt und wird auch häufig in tuts usw erwähnt,
    dass man mit Assembler Treiber programmiert und er vorallem in emebdded
    Systems benutzt wird.
    Ich habe mal etwas zu diesem Thema im Internet herumgeguckt und musste
    festellen, dass selbt in den Bereichen Treiber und embedded Systems C,
    C++ und was weiß ich bevorzugt genutzt werden.

    Nun ist meine Frage, gibt es überhaupt noch Gebiete wo der Assembler
    zwingend benötigt wird oder es Sinn macht ihn zu benutzen.

    Desweiteren wird immer erzählt "In Assembler muss man alles selbst
    machen". Dieser Satz mag zwar richtig sein, aber in fast oder gar ALLEN
    Büchern, Tutorials usw benutzt man zum Ausgeben von Text oder Grafik
    wieder Betriebssystemfunktionen. Da frage ich mich.
    Wo ist der Unterschied ob ich nun in C die Funktion printf aufrufe oder
    in Assembler int 21h benutze??
    Denn ich persöhnlich denke, dass man dann doch lieber direkt C oder C++
    benutzen sollte.

    Wenn man ein Buch schreibt, dass Assembler behandelt, dann sollte man doch auch die Vorteile in den Vordergrund heben, z.B. dass man halt die Textausgabe machen kann wie man will.
    Aber so ein Buch habe ich noch nicht gefunden.

    Meine beiden Hauptfragen sind:

    1)gibt Gebiete wo Assembler zwingend benötigt wird oder es Sinn macht ihn zu benutzen.

    2)Gibt es auch Assembler tuts wo richtig auf die Kommunikation zwischen Hardware und Software eingegangen wird und man nicht wieder auf fertige libs makros und dlls zurückgreift und mann dann im Endeffeckt doch wieder fast nichts selber macht.

    mit freundlichen Grüßen Nock.



  • hi,
    heutige compiler sind so gut, dass es in 'normalen programmen' kaum noch sinn macht asm einzusetzen...und das hat nix mit der geschwindigkeit des prozessors zu tun. asm ist gut wenn man spezielle prozessorfeatures nutzen will, an die man mit z.b. C nicht drankommt oder wenn man delays im bereich von bruchteilen von microsekunden braucht (durch einfügen von nops etwa)



  • Zu 1.:
    Weiteres Gebiet: Spezielle Programmstrukturen, zB. bootloader, kleine Demos etc. Sowas bekommst du in Hochsprachen nicht so einfach hingezaubert.

    Zu 2.:
    Was meinst du? Wie du selbst festgestellt hast, hat naeheres Hantieren mit einzelnen Hardwaregeraeten nicht unbedingt was mit Assembler zu tun, also wieso sollte in einem Assemblertutorial darauf besonders eingegangen werden? Das wuerde komplett den Rahmen eines Tutorials sprengen.
    Wenn dich interessiert, wie die Geraete im einzelnen funktionieren, musst du schon gesondert nach Tutorials/Docs fuer die entsprechende Hardware suchen. Dort werden dann zT. auch Codebeispiele in Assembler gebracht.



  • es stimmt zwar, dass es heute kaum sinn macht assembler einzusetzen, nicht aber weil die compiler so gut sind (im gegenteil, die generieren sehr oft schlechten code und hängen sehr davon ab was man reinfüttert), sondern weil es zu zeitaufwendig ist. je nachdem was man als "normale programme" ansieht, macht es öfter sogar keinen "Sinn" c++ einzusetzen und man sollte dann irgendwas wie java/c#/VB nehmen, weil die sprachen speziel dafür gemacht sind (heutige 2-3GHz rechner sind eben auch schnell genug;) ).
    Zwingend benutzen muss man assembler nur in sehr spezialisierten dingen. manchmal schreibt man Shader in assembler, manchmal spezielle algorithmen bei denen jede % an leistungssteigerung wichtig ist (z.b. flüssigkeitssimulationen,raytracing). zum programmieren von betriebssystemen ist assembler nur an sehr wenigen stellen nötig, meist ist eher das wissen über hardware(architektur) wichtig.
    und mit "muss man alles selber machen" meint man die grundlegenden dinge anderer sprachen z.b. aufrufe, virtuelle funktionen, objektorientierung, speicherverwaltung usw. wenn man mit all diesem aufwand einen taschenrechner programmieren möchte, braucht man ein paar wochen denk ich mir (wenn man keine tollen zusatzlibs verwendet), deswegen macht man das in einer interpretierten sprache die von haus aus alle nötigen libs hat und man sich wirklich nur um das nötigste kümmert.



  • Hoi,

    Erstmal Danke für die Antowrten.
    Ich habe mich mal etwas weiter im Netz über Assembler kundig gemacht und
    habe rausgefunde, dass er sehr viel bei Robotorn usw eingesetzt wird.
    Mich interessiert dabei aber weniger das zusammebasteln, sonder eg nur die
    Programmierung der Dinger. Aber ein paar Fragen habe ich noch vorher.

    1)Ich habe viel gelesen und rausgefunden, dass man bei ES und Roboter auch oft ein spezielles C verwendet. Nun ist meine Frage sind das so die einzigen "großen" Sprachen dabei, oder gibt es haufenweise Sprachen, mit denen jedes Drecks-Blag nach 5 Min ein funktionsfähiges System hat?

    2)Kennt ihr ein paar Foren, die sich speziel mit diesen Themen beschäftigen?
    Ich meine ein paar spezielle und nicht soetwas wie "Wer weiß was" oder so.

    Zu guter letzt bräuchte ich noch einen Rat.
    Seit ich angefangen habe zu programmeiren(vor ca. 6 Jahren)
    möchte ich immer besser werden und immer mehr alleine machen.
    Dadran ist eg nichts verwerfliches, aber bei mir geht es soweit, dass ich immer eine Stufe tiefer gehe.

    von Basic auf C++ mit Ogre
    von C++ mit Ogre auf C++ mit OpenGL
    dann war es soweit, dass ich meine eigene API schreiben wollte.
    Das habe ich aber erstmal aufs Eis gelegt und wollte stattdessen mein eigenes OS + eigene Programmiersprache machen.
    Doch dies ist ja mehr oder weniger Sinnlos, denn man muss das Rad ja nicht zum x-ten mal neu erfinden.
    Nun ist meine Frage.
    Könnte mir bitte ein erfahrenen Programmierer mehr oder weniger sagen was ich so machen könnte, denn teils ist es richtig Schade.
    Zum Beispiel hatte ich mit C++ und OpenGl eine kleine Engine fertig, konnte sie aber nicht an einem Spiel testen, da ich ja unbedingt mit Assembler anfangen wollte.
    Es ist schwer zu erklären, aber ich hoffe wenigstens einer versteht undgefähr was ich meine.
    Ich glaube ich bin größenwahnsinnig, aber das schlimme dadran ist, da ich ein unglaublicher Dickkopf bin höre ich nicht auf bis ich es kann.
    So habe ich z.B. 5 Tage lang nur die SDL Funktionen + Strukturen auswendiggelernt.
    Aber deshalb fange ich immer nach ein gewissen Zeit etwas neues an und bekomme so fast nie etwas fertig.

    Ich würde mich über einen guten Rat sehr freuen.

    mfg Nock



  • Nock schrieb:

    2)Kennt ihr ein paar Foren, die sich speziel mit diesen Themen beschäftigen?

    guckst du: http://www.roboternetz.de/phpBB2/



  • Eine weitere kleine Frage noch.
    Warum erstellt eigentlich jedes Assemblerprogramm ne Console?
    Selbst wenn ich einfach nur schreibe

    .MODEL small
    .Stack 100h
    .Data
    .Code
    Start:
    END Start
    

    wird beim ausführen ne Konsole geöffnet.
    Meine einzige Erklärung wäre, dass Windows automatisch eine erstellt.

    mfg



  • Nock schrieb:

    Meine einzige Erklärung wäre, dass Windows automatisch eine erstellt.

    so ist es. dein linker erzeugt eine 'console application' und dafür macht win bei jedem start eine konsolenbox auf.



  • Gibt es auch ne Möglichkeit, dass der Linker keine Console öffnet??
    Es soll aber auch keine Win32 Anwendung werden, oder kann ich sie dann nicht
    mehr unter Windows starten?



  • Nock schrieb:

    Aber deshalb fange ich immer nach ein gewissen Zeit etwas neues an und bekomme so fast nie etwas fertig.

    Ich würde mich über einen guten Rat sehr freuen.
    mfg Nock

    Hallo Nock,

    ja ich kenne diesen Wissensdurst auch. Ich habe früher auf dem C64 mit SimonsBasic angefangen, dann später auf dem Amiga mit dem SEKA Assembler Intros geschrieben und bin dann irgendwann beim PC gelandet. Habe mich dann sehr lange um Grafik gekümmert bis ich dann mal eine Job als Webentwickler bekam und dort beruflich in PHP programmieren musste. Jetzt machen ich grad den Admin an einer Grundschule und vor ein paar Wochen habe ich dann mal wieder Lust bekommen mich mit der Programmierung auseinander zu setzen.

    Mit JAVA habe ich angefangen und habe so die üblichen Sachen mit der Konsole und per GUI ausprobiert. Habe in den Foren über JAVA selbstverständlich viel Geläster über C++ gehört(Speicherlecks etc..) und mir gedacht das schauste dir mal genauer an und seit dem habe ich kein Eclipse mehr an gehabt und nur noch Infos über C++ gesammelt, gelesen und probiert. So wie es ausschaut bleibe ich erstmal schwerpunkmäßig bei C++, denn als Ziel habe ich mal kleine 2D/3D Spiele zu schreiben. Aber ich weiss das man erst mal klein anfängt, ansonsten ist man schnell überfordert und verliert die Lust.

    Wollte Dir nur schreiben, dass es noch mehr Leute gibt die am liebsten alles machen würden und am liebsten sofort. Ich habe da auch noch viel im Hinterkopf halbwegs richtiges OOP, STL, Boost, Entwurfsmuster, WinAPI, wxWidgets, SDL, OpenGL.
    *grins damit bin ich erstmal eine ganze Weile beschäftigt...

    Gruß Chris



  • Um zu verhindern das eine Konsole geöffnet wird wirst du wohl die File-Kennung ändern müssen.

    Nach meinem Wissen ist diese standartmässig "MZ".
    Du must sie mindestens auf "MZE" ändern.

    (Der File sollte dann auch den richtigen Aufbau haben)

    Google mal unter "FileType" bzw "MZE"



  • Hoi,

    Noch mal eine ganz andere Frage.
    VGA und VESA sind doch Grafikstandarts, die von fast jeder Grafikkarte unterstüzt werden?

    Wenn ja, rendern OGL und DX die Frames dann in die Buffer von VESA, oder sind OGL und DX andere eigene Standarts?

    mfg Nock



  • VESA ist im Grunde einfach nur ein Interface, um Grafikmodi zu setzen, und Zugriff auf den Grafikspeicher zu bekommen.
    Wenn du also mit "die Buffer von VESA" den Grafikspeicher meinst, wird 3D-gerenderte Grafik frueher oder spaeter wohl auch dort landen, ja.



  • Ich denke mal DirectX/OpenGL rendern direkt in den Bildschirm rein.



  • Und noch eine kleine Frage.

    Ist es normal, dass der TASM 3.2 das Symbol OFFSET nicht kennt?
    Und wie komme ich ohne dieses Symbol an die Offset-Addresse.

    mfg Nock



  • Und noch eine kleine Frage zum VGA Modus.
    Ich habe folgendes simples Programm geschrieben, aber es erzielt nicht den gewünschten Effekt. Es soll einen farbigen Punkt bei 0,0 alo oben links malen.

    .MODEL small ;exe 
    .STACK 100h  ;256 Byte
    .DATA        ;Daten
    .CODE        ;Code
    Start:
    
    mov al,13h ;al=13h
    int 10h ;in den VGA Modus schalten
    
    mov ax,0A000h
    mov es,ax ;Anfang des VGA Segmentes nach es
    mov ax,0h ;ax=0
    mov [es:ax],30h; Punkt mit der Farbe 30h nach [es:ax] also 0A000h:0h malen
    
    ...
    
    Start END
    

    Aber der Punkt ist in der Mitte des Bildschirms und ich kann mir nicht erklären warum.



  • Praktisch duerfte der Code, den du gepostet hast, gar nicht lauffaehig sein.

    1. Du kannst nicht unbedingt davon ausgehen, dass ah beim Programmstart 0 ist.
    2. Mit ax kann nicht adressiert werden.
    3. "mov [es:ax],30h" enthaelt keine Aussage ueber die Groesse des 2. Operanden und sollte sich so nicht verarbeiten lassen.

    ==> So kann ich dir auch nicht sagen, warum der Punkt auf der Mitte des Schirms gezeichnet wird.



  • Vielen Dank,

    hatte "byte ptr" vergessen....
    Aber wenn ich mit ax addresiere funktioniert es trotzdem.
    Keine Ahnung warum



  • net schrieb:

    heutige compiler sind so gut, dass es in 'normalen programmen' kaum noch sinn macht asm einzusetzen...und das hat nix mit der geschwindigkeit des prozessors zu tun.

    Dem möchte ich mich uneingeschränkt anschliessen.

    Selber verwende ich Assembler beispielsweise auf Architekturen ohne RAM; da mußt Du dann mit einigen wenigen Prozessor-Registern aukommmen. Für diese Architekturen gibt es "normalerweise" auch gar keine C-Compiler.

    Auch verwende ich Assembler, wo es auf geringen Stromverbrauch ankommt (bei mir ist das fast immer der Fall). Klar, die meiste Zeit verbringt der Prozessor eh damit, nichts zu tun. In dieser Zeit ist der Prozessor aber in einen stromsparenden Modus geschaltet (und wenn es nur IDLE ist). Wenn ich diese Zeit (in einem Sekunden-Interval) um eine Mikro-Sukunde verlängern kann, geht mir mir einer ab. Ultra-Low Power Anwendungen lassen sich in Assembler dann doch wesentlich feiner steuern. Das kann natürlich auch nur persönliche Spinnerei sein, aber mir geht das so.


Anmelden zum Antworten