PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Lerne Assembler, suche Beispiele


BAGZZlash
2007-09-14, 18:28:13
Arbeite mich gerade durch ein Assembler-Buch und hab' soweit schon die wichtigsten Befehle gelesen und verstanden. Trotzdem tu' ich mich noch etwas schwer damit, Programme zu erzeugen.
Hab' mir schon NASM 'runtergeladen und versucht, solche einfachen Programme zu assemblieren, das Ergebnis ist aber Kauderwelsch auf dem Bildschirm:


mov ax, 5h
mov ds, ax
mov ah, 9h
int 21h
mov ah, 4Ch
int 21h
mov ah, 0
int 21h


Daher suche ich einige kleine, didaktische Beispielprogramme ("Hello World" und so), mit denen ich einsteigen kann. Also nochmal: Mir geht's um Stand-alone-ASM, nicht um Inline-Assembler. Außerdem stehe ich am Anfang, mit hochoptimiertem Code von Demos oder Anwendungen kann ich nix anfangen. Wo finde ich Beispielcode?

Lawmachine79
2007-09-14, 18:57:28
Arbeite mich gerade durch ein Assembler-Buch und hab' soweit schon die wichtigsten Befehle gelesen und verstanden. Trotzdem tu' ich mich noch etwas schwer damit, Programme zu erzeugen.
Hab' mir schon NASM 'runtergeladen und versucht, solche einfachen Programme zu assemblieren, das Ergebnis ist aber Kauderwelsch auf dem Bildschirm:


mov ax, 5h
mov ds, ax
mov ah, 9h
int 21h
mov ah, 4Ch
int 21h
mov ah, 0
int 21h


Daher suche ich einige kleine, didaktische Beispielprogramme ("Hello World" und so), mit denen ich einsteigen kann. Also nochmal: Mir geht's um Stand-alone-ASM, nicht um Inline-Assembler. Außerdem stehe ich am Anfang, mit hochoptimiertem Code von Demos oder Anwendungen kann ich nix anfangen. Wo finde ich Beispielcode?
Wie setzen sich diese ax, 5h usw zusammen? Sind das Speicherstellen im RAM? Und wieso werden in Assembler Software Interrupts aufgerufen? Oder sind Softwareinterrupts quasi Unterprogramme in Maschinensprache im Microcode?

del_4901
2007-09-14, 19:08:26
Wie setzen sich diese ax, 5h usw zusammen? Sind das Speicherstellen im RAM? Und wieso werden in Assembler Software Interrupts aufgerufen? Oder sind Softwareinterrupts quasi Unterprogramme in Maschinensprache im Microcode?
Die SW-Interrupts sind Einsprungstellen zu DOS-Funktionen.

Crazy_Chris
2007-09-14, 19:18:04
Wie setzen sich diese ax, 5h usw zusammen? Sind das Speicherstellen im RAM? Und wieso werden in Assembler Software Interrupts aufgerufen? Oder sind Softwareinterrupts quasi Unterprogramme in Maschinensprache im Microcode?

Das sind nur CPU Register in den er Werte reinschreibt.

BAGZZlash, wozu willst du x86 Assembler eigentlich lernen? Wird doch nur extremst selten benötigt.

Ich hab im Anhang mal einige meiner Programme hinzugefügt mit denen ich eingestiegen bin. :tongue::rolleyes: (ich mußte) Auch ohne Doku kann man die sehr leicht verstehen. ;)

Lawmachine79
2007-09-14, 19:48:44
Wie genau funktioniert denn die Nomenklatur der Register?

BAGZZlash
2007-09-14, 20:09:19
BAGZZlash, wozu willst du x86 Assembler eigentlich lernen? Wird doch nur extremst selten benötigt.

Ich hab im Anhang mal einige meiner Programme hinzugefügt mit denen ich eingestiegen bin. :tongue::rolleyes: (ich mußte) Auch ohne Doku kann man die sehr leicht verstehen. ;)


Cool, danke. Sowas hab' ich gesucht! :smile:

Warum ich das lernen will? Aus Spaß! Hat mich schon immer interessiert. Ernsthaft was machen will ich damit nicht, ich entwickle in Hochsprachen.


Wie genau funktioniert denn die Nomenklatur der Register?


Da will wohl noch jemand ASM lernen, was? :wink:

Gast
2007-09-14, 20:35:24
laufen die int 21h überhaupt noch in win-xp ? :)
wenn de das durchhast würd ich zu simd-befehlen wechseln, da bringt das lernen sogar was...

BAGZZlash
2007-09-14, 21:24:46
laufen die int 21h überhaupt noch in win-xp ? :)
wenn de das durchhast würd ich zu simd-befehlen wechseln, da bringt das lernen sogar was...

Natürlich, in der Dosbox. Und zu SIMD ist's ja gar nicht so weit.

pest
2007-09-14, 21:41:02
der gast war ich...:rolleyes:
naja bei simd ist das prob das man beim programmieren m.M. nach
anders rangehen muss, damit bestimmte algorithmen auch von simd profitieren.
andererseits hast du ja geschrieben das du nur standalone-asm machen willst, warum ist mir allerdings schleierhaft :biggrin:, gibt aber ein paar gute Win32-Tutorials für Masm

maprie
2007-09-15, 00:35:26
So unnütz ist Assembler gar nicht, zumindest nicht als Grundlage für C und ähnliche hardwarenahe Sprachen. Viele Sachen versteht man erst, wenn man Assembler etwas kennt. Aber ich würde es wirklich nur als Grundlage lernen und nicht vertieft einsteigen.

Edit: Die Aufgaben von der FH-Wedel sind fürs durcharbeiten sehr gut, kann ich empfehlen:
http://www.fh-wedel.de/~bek/

Gast
2007-09-16, 18:14:04
wenn de das durchhast würd ich zu simd-befehlen wechseln, da bringt das lernen sogar was...
Ist selbst dann reichlich sinnlos für die Praxis.
Tiefer als SIMD Intrinsics geht kein Mensch mit Verstand, wenn produktiv gearbeitet werden soll.

tokugawa
2007-09-16, 19:16:17
Ist selbst dann reichlich sinnlos für die Praxis.
Tiefer als SIMD Intrinsics geht kein Mensch mit Verstand, wenn produktiv gearbeitet werden soll.

Außer die Praxis heißt Vector-Units der PS2 programmieren. Wobei es da mittlerweile auch schon Middleware dafür gibt, aber die kostet halt.

Simon
2007-09-16, 19:59:39
Ist selbst dann reichlich sinnlos für die Praxis.
Tiefer als SIMD Intrinsics geht kein Mensch mit Verstand, wenn produktiv gearbeitet werden soll.
Na dann versuch mal vernünftig zu debuggen ohne Assembler :|

Coda
2007-09-16, 20:20:02
Also ich brauch seltenst die Assembly-Ansicht beim Debuggen.

Gast
2007-09-16, 20:46:23
Also ich brauch seltenst die Assembly-Ansicht beim Debuggen.
Kannst Du denn vielleicht erklären, warum es z.B. für Photoshop noch von Hand in Assembler optimierte PlugIns gibt?

Coda
2007-09-16, 21:14:30
Naja sobald man SSE verwendet braucht man zumindest Intrinsics, und viele benützen auch den Inline-Assembler dafür.

Aber normalen Code würde ich wirklich nicht mehr in Assembler schreiben.

Gast
2007-09-16, 21:30:33
Naja sobald man SSE verwendet braucht man zumindest Intrinsics, und viele benützen auch den Inline-Assembler dafür.

Aber normalen Code würde ich wirklich nicht mehr in Assembler schreiben.
Auch nicht für embedded systems?

Coda
2007-09-16, 22:15:59
Ich denke wir gehen in dem Thread von x86 aus, oder nicht?

tokugawa
2007-09-16, 22:34:12
Ich hab nicht mal bein PS2-debuggen die Assembler-Ansicht gebraucht, obwohl ich vom Lead schon vorgewarnt wurde dass man die dann braucht wenn der GCC einfach Scheiße baut (was er leider sehr sehr sehr oft macht) und was kompiliert was in C++ gar nicht da steht :)

del_4901
2007-09-16, 22:52:05
Ich hab nicht mal bein PS2-debuggen die Assembler-Ansicht gebraucht, obwohl ich vom Lead schon vorgewarnt wurde dass man die dann braucht wenn der GCC einfach Scheiße baut (was er leider sehr sehr sehr oft macht) und was kompiliert was in C++ gar nicht da steht :)
Das ist heftig ... aus der Zeit sollten wir doch raus sein. Ok, jetzt darf ich wieder auf dem gcc rumhacken ... OpenSource fehlende QA. ;-)

noid
2007-09-16, 23:08:44
Auch nicht für embedded systems?

Ganz wenige hochoptimierte Dinge vllt - aber der große Rest in C (oder andere).
Vorallem liest sich das so schräg. Noch besser ist C-Coder der 1:1 von Asm nach C "konvertiert" wurde. Das liest sich wie ne benutzte Monatsbinde, eklig.

Coda
2007-09-16, 23:24:28
Das ist heftig ... aus der Zeit sollten wir doch raus sein. Ok, jetzt darf ich wieder auf dem gcc rumhacken ... OpenSource fehlende QA. ;-)
GCC wird größtenteils von bezahlten Mitarbeitern großer Firmen geschrieben. Blödes Argument also.

aths
2007-09-17, 00:50:45
Cool, danke. Sowas hab' ich gesucht! :smile:

Warum ich das lernen will? Aus Spaß! Hat mich schon immer interessiert. Ernsthaft was machen will ich damit nicht, ich entwickle in Hochsprachen.Ich hab kürzlich mit TASM ein sehr kleines Ding programmiert. Das wäre in einer Hochsprache viel aufwändiger geworden. Einziges Problem: Ich kriege es nur als Exe kompiliert, nicht als Com-Datei. Aber egal.

tokugawa
2007-09-17, 00:55:27
Das ist heftig ... aus der Zeit sollten wir doch raus sein. Ok, jetzt darf ich wieder auf dem gcc rumhacken ... OpenSource fehlende QA. ;-)

Naja, ist auch eine alte Version vom GCC. Trotzdem teilweise haarsträubende Dinge, z.B. Internal Compiler Error, und dann nochmal auf "Kompilieren" und dann gehts - ohne was zu ändern. Oder aber eine Leerzeile einfügen hilft auch. Oder Initialisierungen wie "Type a = irgendwas" auflösen in "Type a; a = irgendwas".

Coda
2007-09-17, 02:30:03
Ich hab kürzlich mit TASM ein sehr kleines Ding programmiert. Das wäre in einer Hochsprache viel aufwändiger geworden. Einziges Problem: Ich kriege es nur als Exe kompiliert, nicht als Com-Datei. Aber egal.
Was denn?

BAGZZlash
2007-09-17, 08:34:43
Ich hab kürzlich mit TASM ein sehr kleines Ding programmiert. Das wäre in einer Hochsprache viel aufwändiger geworden. Einziges Problem: Ich kriege es nur als Exe kompiliert, nicht als Com-Datei. Aber egal.

Dann nimm' doch NASM (http://nasm.sourceforge.net/).

Gast
2007-09-17, 17:40:59
Ein bekannter Programmierer sagte mir mal, dass das, was einen wirklichen Meisterprogrammierer unter anderem ausmacht die Fähigkeit ist zu wissen, was genau im Computer passiert, wenn sein Programm ausgeführt wird.

Er hat es zwar nicht explizit erwähnt, aber ich habe mir gedacht, dass man doch eigentlich nur über Assembler wirklich sehen kann, was intern vorgeht. Man braucht nicht in Assembler zu programmieren, aber nur wenn man es versteht und seinen Code immer mal wieder damit unter die Lupe nimmt kann man Meister werden, wäre meine Überlegung. Was meint ihr?

Coda
2007-09-17, 18:00:14
Klar. Assembler können für die Architektur die man benützt ist nie ein Fehler. Empfehle ich jedem der programmiert.

noid
2007-09-17, 18:02:40
Klar. Assembler können für die Architektur die man benützt ist nie ein Fehler. Empfehle ich jedem der programmiert.

Du würdest dich wundern wie wenige was mit nem Assembly anfangen können.

Coda
2007-09-17, 18:40:02
Nö würde es nicht. Ich sage ja nur, dass ich es jedem empfehle. Ich weiß dass sich kaum jemand drum schert.

tokugawa
2007-09-17, 19:01:07
Ein bekannter Programmierer sagte mir mal, dass das, was einen wirklichen Meisterprogrammierer unter anderem ausmacht die Fähigkeit ist zu wissen, was genau im Computer passiert, wenn sein Programm ausgeführt wird.

Er hat es zwar nicht explizit erwähnt, aber ich habe mir gedacht, dass man doch eigentlich nur über Assembler wirklich sehen kann, was intern vorgeht. Man braucht nicht in Assembler zu programmieren, aber nur wenn man es versteht und seinen Code immer mal wieder damit unter die Lupe nimmt kann man Meister werden, wäre meine Überlegung. Was meint ihr?

Das alleine reicht sicher nicht aus um Meister zu sein.

Der beste Assembler-Hacker kann trotzdem ein miserabler Programmierer sein, wenn er unfähig ist, in einer Ebene zu denken (die meistens dann im Hochsprachen-Level liegt) wo es um Dinge wie Software-Design und Kommunikation zu Kollegen (entweder untergebene Programmierer wenn man Lead Programmer ist, oder halt generell Kollegen) geht.

Einen Meisterprogrammierer macht eher aus dass er in vielen Bereichen versiert ist. Vielseitigkeit ist das Merkmal eines wahren Meisters.


Du würdest dich wundern wie wenige was mit nem Assembly anfangen können.

Du würdest dich wundern wie selten sowas auch tatsächlich in der Praxis gebraucht wird. Schaden tut's aber - wie Coda schon meinte - sicher nicht. Es ist auch nichts verkehrtes daran, sich Assembly erst dann anzuschauen wenn man's wirklich braucht (speziell wenn man wie in der Spieleindustrie es mit vielen verschiedenen Architekturen zu tun hat). On Demand quasi. Frei nach dem Sprichwort: Man muß nicht alles wissen, aber man muß wissen wie man sich's gegebenfalls aneignen kann.

Aber genauso schadet es einem Programmierer nicht, Klavierspielen oder Japanisch zu lernen. Das dient nämlich alles der geistigen Horizonterweiterung, die nie schadet. Die damit stimulierten Gehirnbereiche wirken sich dann auch auf's Programmieren aus (genau wie ich Latein in der Schule für sinnvoll halte da man damit logisches Denken und Sprachvermögen sowie analytisches Verständnis trainiert).

Spasstiger
2007-09-17, 20:02:24
Ich hab zwar an der Uni schon einiges an Assemblercode geschrieben, aber nie für die x86-Architektur. Ich persönlich sehe für mich auch keinen Sinn darin, x86-Assembler zu lernen. Bin auch mehr an der Hardwareentwicklung als an der Softwareentwicklung interessiert. ;)

Demirug
2007-09-17, 20:48:18
Er hat es zwar nicht explizit erwähnt, aber ich habe mir gedacht, dass man doch eigentlich nur über Assembler wirklich sehen kann, was intern vorgeht.

Spätestens wenn man mehr als einen Thread hat erkennt man sehr schnell das die CPU eben nicht genau das tut was im Assembler Code steht.

HeldImZelt
2007-09-18, 00:28:46
Mit Assembler kann man Wissen und Grundlagen erlangen, die in dieser Form wahrscheinlich einzigartig sind. Die Frage, ob man es braucht, stellt sich eigentlich nicht.

Auch wenn man es in der heutigen Zeit eher als 'dunkle Seite der Macht' ansehen mag, stellt es eine hohe Kunst von Programmierung und Verständnis dar, die unverzichtbar bei Kryptographie, reverse engineering und optimaler Programmierung ist.

Wer Tutorials für Win32 Assembler (MASM32) sucht, ist mit dieser Seite (http://win32assembly.online.fr/tutorials.html) gut beraten. Für die andere Seite bieten sich Tutorials mit Softice (R.I.P.), IDA und OllyDbg an.

tokugawa
2007-09-18, 02:15:56
Auch wenn man es in der heutigen Zeit eher als 'dunkle Seite der Macht' ansehen mag, stellt es eine hohe Kunst von Programmierung und Verständnis dar, die unverzichtbar bei Kryptographie, reverse engineering und optimaler Programmierung ist.


Auch wenn ich dir nicht wirklich widerspreche, reizt mich das Wort "optimale Programmierung" immer im Zusammenhang mit Assembler aus mehreren Gründen:

- Wenn ein Programmcode durch irgendeine Optimierung (z.B. eben durch Assembler) ein klitzekleines bißchen schneller wird, aber dafür gänzlich unlesbar, unwartbar und unportierbar (falls das wichtig ist - in der Spieleindustrie, also dem Gebiet wo die Performance auch wichtig ist - ist Portabilität in der Regel sehr wichtig) wird, ist die etwas langsamere Variante definitiv vorzuziehen. Die wahre Kunst ist es, lesbaren, wartbaren und schnellen (vor allem algorthmisch schnellen!) Code zu schreiben

- "Optimal" bezieht sich in diesem Zusammenhang wohl rein auf den Performanceaspekt. "Optimaler Code" kann aber vieles heißen: optimal in Bezug auf Wiederverwendbarkeit, auf Lesbarkeit, Verständlichkeit, algorithmische Optimalität, usw. Jeden Zyklus zu zählen, und das dann als Optimalen Code zu bezeichnen, ist nur eine Facette, und es wäre falsch zu glauben dass das das einzige Kriterium wäre

- Heutzutage kann man nicht mehr viel rausholen über handoptimierten Code, ohne den Code unlesbar und unwartbar zu machen. Das muß man sich also GUT überlegen. Mir kommen diese "ach, ich kitzle die letzten paar Zyklen"-Menschen etwas wie Träumer vor - sitzen oft dann vor noch langsameren Code als es ein optimierender Compiler erzeugt hätte, mit dem Dilemma dass der Code dann so häßlich ist dass ihn niemand mehr anrühren will.


Also: für edukative Zwecke ja, aber in der Praxis wird es nicht wirklich verwendet und ist auch wenig sinnvoll.

Coda
2007-09-18, 02:26:47
Spätestens wenn man mehr als einen Thread hat erkennt man sehr schnell das die CPU eben nicht genau das tut was im Assembler Code steht.
Demirug, wenn du solche Antworten gibst dann schreib doch auch dazu was du meinst. Das hilft keinem weiter.

Ich gehe davon aus, dass du meinst, dass die Speicherzugriffe nicht unbedingt atomisch sind, richtig?

Demirug
2007-09-18, 07:45:48
Demirug, wenn du solche Antworten gibst dann schreib doch auch dazu was du meinst. Das hilft keinem weiter.

Ich gehe davon aus, dass du meinst, dass die Speicherzugriffe nicht unbedingt atomisch sind, richtig?

Solange sie and den Grenzen ausgerichtet sind und die richtige Größe haben ist das kein Problem. Das Problem ist das reordering (selbst bei In Order CPUs) von IO Anweisungen. Da können ganz schnell merkwürdige Dinge passieren die rein vom Assemblercode her nicht passieren dürften. Der reine Assemblercode lässt einen da oft glauben man könnte ohne entsprechende teure Syncronisationsobjekte auskommen was dann aber nicht funktioniert.

BAGZZlash
2007-09-18, 10:38:04
Mit Assembler kann man Wissen und Grundlagen erlangen, die in dieser Form wahrscheinlich einzigartig sind. Die Frage, ob man es braucht, stellt sich eigentlich nicht.

Auch wenn man es in der heutigen Zeit eher als 'dunkle Seite der Macht' ansehen mag, stellt es eine hohe Kunst von Programmierung und Verständnis dar, die unverzichtbar bei Kryptographie, reverse engineering und optimaler Programmierung ist.

Wer Tutorials für Win32 Assembler (MASM32) sucht, ist mit dieser Seite (http://win32assembly.online.fr/tutorials.html) gut beraten. Für die andere Seite bieten sich Tutorials mit Softice (R.I.P.), IDA und OllyDbg an.

Cool, danke auch dafür. Mit Win32-ASM wollte ich mich zwar erst später beschäftigen, hab' aber trotzdem schonmal das Hello-World-Tutorial gemacht! :smile: