Assembler lernen (x86)

danlei

Well-Known Member
In Dettus' Programmiersprachenthread outen sich ja manche als Assemblerprogrammierer.

Kann mir jemand gute Online-Literatur (x86) zum Einstieg empfehlen? Ich habe schon gegoogelt, aber das Meiste geht entweder nicht über eine knappe Einleitung hinaus (Hallo Welt & Co), oder bezieht sich auf die DOS-Welt. Zum Lisp lernen kam ich mit Google schon sehr weit, bei Unix-Assembler hab ich noch nichts vernünftiges gefunden.

Außerdem würde mich Interessieren, ob Ihr in Intel- oder AT&T-Syntax codet. Ich persönlich finde AT&T ein Bisschen verkorkst, kann aber auch daran liegen, dass ich mich früher unter DOS ja immer nur mit Intel rumgeschlagen habe. (Diese ganzen Prä- und Suffixe nerven, und die Memory Operands sind auch gewöhnungsbedürftig) Deshalb wäre für mich nasm o.Ä. am bequemsten.

Also, falls jemand gute Online-Literatur zum Thema kennt, bitte posten. Ein gutes Linux-Tutorial würde mir sehr helfen, oder natürlich BSD orientiert. (Hab schonmal den Unterschied gelernt, dass man bei den BSDs die Syscall-Parameter auf den Stack pusht, bei Linux in DOS-Manier in die Register schiebt ;) )

EDIT:
Für FreeBSD scheint http://www.int80h.org/bsdasm/#intro vielversprechend zu sein, leider habe ich zu Linux noch nichts Entsprechendes gefunden.
 
Zuletzt bearbeitet:
Hallo d4mi4n!

Die Beiden Letzten Links habe ich schon durch, das "FreeBSD Assembly Language Tutorial" scheint sehr gut zu sein.

Dein erster Link sieht sehr interessant aus, das seh ich mir auf jeden Fall an. Die nutzen zwar einen eigenen Assembler (HLA), aber der steht zum Download.

Vielen Dank!
 
Ich hab mir jetzt mal den ganzen Kram (AoA und HLA) runtergeladen und bin am installieren. Das Buch scheint echt sehr gut zu sein, 1500 Seiten; da hab ich auf jeden Fall genug Material für die nächsten paar... mindestens Monate.

Hast mir sehr geholfen!

Ich hab übrigens noch was sehr praktisches gefunden:

Eine schöne Tabelle über die wichtigsten x86 Befehle, 2 DIN-A-4 Seiten. Hier als PDF zum Download: http://www.jegerlehner.ch/intel/
 
aspiring schrieb:
Ich hab mir jetzt mal den ganzen Kram (AoA und HLA) runtergeladen und bin am installieren. Das Buch scheint echt sehr gut zu sein, 1500 Seiten; da hab ich auf jeden Fall genug Material für die nächsten paar... mindestens Monate.

Hast mir sehr geholfen!

Ich hab übrigens noch was sehr praktisches gefunden:

Eine schöne Tabelle über die wichtigsten x86 Befehle, 2 DIN-A-4 Seiten. Hier als PDF zum Download: http://www.jegerlehner.ch/intel/

Guten Morgen,(wg. Nachschicht)

also hatte mich zu Anfang auch einmal mit Assembler unter den verschiedenen Betriebssystemen befasst, allerdings rein theoretisch. Assembler ist zwar wahnsinnig schnell, aber extrem langsam zu lernen (Glückwunsch an die, die das schaffen).

So das erste was mir schwerfiel aber das hast Du ja schon treffend eingegefügt war die versch. Syntax Intel oder halt AT&T.
Das habe ich versucht unter das unter Linux umzusetzen, was mir dann aufgefallen ist war das der nasm etwas ganz anderes wie zBsp Gnat unter linux oder wie der jetzt genau heisst (schon sehr lange her) ausgibt.
Auch gibt es den Tasm ja und noch Fasm da kommt man leicht durcheinander. *grins*

Habe hierzu mal einen alten Link ausgegraben(aus meiner host_datei) da stehen auch jede Menge gute Bücher dazu.

http://www.lcs-chemie.de/assemb.htm

und noch den link ausgegraben der sich mit problemchen mit Nasm auseinandersetzt:

http://de.nntp2http.com/comp/lang/assembler/x86/2005/05/cd3e1fb2f0e3b970a32f8815abc27c7b.html

So jetzt wünsche ich Dir die Ausdauer zu Assembler, die mir leider abgeht( "Schande über mein Haupt" ), ja und noch viel Erfolg.

freundlichst Gecko (der jetzt dringend einen starken Kaffe braucht)
 
Gecko schrieb:
Assembler ist zwar wahnsinnig schnell, aber extrem langsam zu lernen (Glückwunsch a die, die das schaffen).
Schnell im vergleich wozu? Durch die Verwendung von Assembler steigt doch weder der Prozessortakt, noch der verfügbare Speicher.
 
[LoN]Kamikaze schrieb:
Schnell im vergleich wozu? Durch die Verwendung von Assembler steigt doch weder der Prozessortakt, noch der verfügbare Speicher.

Okay gebe zu habe mich unpräzise ausgedrückt, auf alle Fälle ist ein Programm in Assembler wesentlich schneller in seiner Ausführgeschwindigkeit, als ein Programm das in Java geschrieben wurde.

Denke zu dieser Aussage kann ich stehen.

Das schreibe ich ganz bewusst als jemand der ganz gerne in Java programmiert hat.

freundlichst Gecko (der immer noch müde ist)
 
@Gronau
Der deutsche Eintrag scheint nur auf DOS einzugehen, aber der englische könnte interessant sein.

@Gecko
Mir gehts in erster Linie um den Lerneffekt; ich glaube nicht, dass ich irgendwann einen Großteil meiner Programme in ASM schreibe. Dafür gibts schließlich Lisp ;). Ich denke, was [LoN]Kamikaze meint ist, dass man schon ein sehr guter Assemblerprogrammierer sein muss, um heutige Compiler zu übertreffen.


Ich hab mich schonmal in AoA eingelesen und muss sagen, dass ich ein Bisschen skeptisch bin. Der HLA (High Level Assembler), welcher im Buch verwendet wird, hat auf den ersten Blick nicht viel mit Assemblerprogrammierung gemein:

Code:
program HelloWorld;

#include("stdlib.hhf")

begin HelloWorld;
      stdout.put("Hello, World!", nl);
end HelloWorld;

Na, schon mal so eine Assemblersyntax gesehen? Der Autor meint jedenfalls, dass man trotz der hochsprachlichen Eigenschaften einen 'echten' Assembler vor sich hat und nutzt HLA um seine Studenten zu unterrichten. Hm...
 
Zuletzt bearbeitet:
Ich habe damals durch das Tutorial von Draeden/VLA Assembler gelernt. Da ist eigentlich alles drin was man so braucht. Bezieht sich allerdings auf Dos/Tasm. Ist dafür kurz und somit schnell durchgearbeitet.

http://web.textfiles.com/software/

asmintro.txt
asm0.txt
asm1.txt
asm2.txt
asm3.txt


Und jetzt mal ganz ehrlich: Kommentare wie "Schnell im vergleich wozu? Durch die Verwendung von Assembler steigt doch weder der Prozessortakt, noch der verfügbare Speicher." kann man sich wohl sparen, oder? :belehren:
 
Zuletzt bearbeitet:
@Sagrotan

Danke für die Links, aber es geht mir speziell um Unix-Assemblerprogrammierung. Ich bin auch ganz froh, dass ich mich nicht mehr mit segmentiertem Speicher rumärgern muss ;) . Nachdem, was ich bis jetzt gesehen habe, scheint Assembler unter Linux/BSD um einiges mehr Spaß zu machen als unter DOS, z.B. Kommandozeilenparameter einfach vom Stack poppen; unter DOS war das ein ziemlicher Krampf.

Der Link aus meinem ersten Posting entspricht bis jetzt am ehesten dem was ich suche. Vielleicht ist es auch ein guter Weg mit kleinen Programmen in C anzufangen und die nach Assembler zu kompilieren. So kann man auch eine ganze Menge lernen. Das hat dann aber den Nachteil, dass ich mich mit der AT&T-Syntax rumschlagen muss.
 
Gecko schrieb:
Okay gebe zu habe mich unpräzise ausgedrückt, auf alle Fälle ist ein Programm in Assembler wesentlich schneller in seiner Ausführgeschwindigkeit, als ein Programm das in Java geschrieben wurde.

Denke zu dieser Aussage kann ich stehen.
So? Dann belege diese Aussage doch bitte einmal. Es gibt eine Vielzahl von Compiler- und VM-Kniffe, welche man mittels Assembler nur sehr schwer nachbilden kann.

Mit guten Tools ist es einfacher schnellen Code in einer Hochsprache zu schreiben, als sich um alles selber zu kuemmern (was man bei der Komplexitaet der heutigen System schlicht und ergreifend gar nicht mehr kann).
 
@Gronau
Ich hab mir das englische Wikibook jetzt ein Bisschen durchgesehen, ist hilfreich. Danke für den Link!
 
MrFixit schrieb:
So? Dann belege diese Aussage doch bitte einmal. Es gibt eine Vielzahl von Compiler- und VM-Kniffe, welche man mittels Assembler nur sehr schwer nachbilden kann.

Mit guten Tools ist es einfacher schnellen Code in einer Hochsprache zu schreiben, als sich um alles selber zu kuemmern (was man bei der Komplexitaet der heutigen System schlicht und ergreifend gar nicht mehr kann).

also ich wolllte auf keinen Fall jetzt hier einen Streit vom Zaune brechen, aber Du musst Doch zugeben das gerade in der Spieleprogrammierung immer noch Assembler eingesetzt wird.

Wie ich auch anmerkte sind meine Kenntnisse bezüglich ASM eher bescheidener Natur. Allerdings gibt es einen Virenscanner den ich unter Windows verwende und dieser ist komplett in Assembler geschrieben, also ist es doch zu realisieren.

Also ich möchte auf keinen Fall den Rechthaber spielen aber laut Auszug Wikipedia ist meine Aussage nicht falsch:

Assemblerprogramme sind schneller als die Produkte der Hochsprachencompiler. Allerdings setzt dies jahrelange Erfahrung des Programmierers voraus. Ein Einsteiger wird einen langsameren Code schreiben und eher von den Compilaten eines guten Compilers lernen können als diesen zu übertreffen. Der Nutzen von Assembler liegt vielmehr in dem Verstehen, wie ein System arbeitet und funktioniert, um damit in Hochsprachen umständliche Konstrukte zu vermeiden. Auch heute noch wird an vielen Hochschulen Assembler gelehrt. Es geht darum, ein Gefühl für den Rechner und seine Arbeitsweise zu bekommen.

Bei vielen Anwendungen für Geräte, die von Mikrocontrollern gesteuert sind, war früher oft eine Programmierung in Assembler notwendig, um die knappen Ressourcen dieser Mikrocontroller optimal auszunutzen. Dies gilt heute praktisch nur noch, wenn wegen Massenproduktion möglichst günstige und damit minimale Mikrocontroller verwendet werden sollen und das Programm nicht zu komplex ist. Um Code für solche Mikrocontroller zu erzeugen, werden Cross-Assembler bei der Entwicklung eingesetzt. Moderne C-Compiler haben aber auch in diesem Bereich die Assembler abgelöst. Nicht zuletzt aufgrund größerer Programmspeicher bei gleichen Kosten für die Chips fallen die Vorteile von Hochsprachen gegenüber der - teils - verschwindend geringen - Vorteilen der Assemblersprache immer mehr ins Gewicht.

Früher wurden sogar ganze Betriebssysteme in einer Assemblersprache geschrieben. Heute wird jedoch C bevorzugt. Allerdings müssen häufig kleine Assemblerroutinen Hardware-nahe Aufgaben in Betriebssystemen übernehmen. Dazu gehört zum Beispiel das Speichern von Registern in Schedulern, oder bei der x86-Architektur der Teil des Boot-Loaders, der innerhalb des 512 Byte großen Master Boot Records untergebracht sein muss. Auch Teile von Gerätetreibern werden in Assemblersprache geschrieben, falls aus den Hochsprachen kein effizienter Hardware-Zugriff möglich ist. Manche Programmiersprachen wie C erlauben es, direkt im eigentlichen Quellcode Assemblercode, sogenannte Inline-Assembler-Routinen, einzubetten.

Es gibt Fälle, in denen diskrete Berechnungen einfacher und effizienter direkt in Assembler geschrieben werden. Die meisten Hochsprachencompiler übersetzen zuerst in Assemblercode oder können diesen optional ausgeben, so dass man, wenn man will, Details genauer betrachten und gewisse Stellen von Hand optimieren kann.

Bis ca. 1990 wurden die meisten Computerspiele in Assemblersprachen programmiert, da nur so auf Heimcomputern und den damaligen Spielkonsolen eine akzeptable Spielgeschwindigkeit und eine den kleinen Speicher dieser Systeme nicht sprengende Programmgröße zu erzielen war. Noch heute gehören Computerspiele zu den Programmen, bei denen am ehesten kleinere assemblersprachliche Programmteile zum Einsatz kommen, um so zum Beispiel die Prozessorerweiterungen wie SSE (Intel CPUs) zu nutzen.

wünsche euch ne geruhsamme Nacht muss bald wieder los Nachtdienst die gelbe Firma Gecko
 
Zuletzt bearbeitet:
http://www.drpaulcarter.com/pcasm/ und anschließend http://www.int80h.org/bsdasm/ ist IMO eine ganz annehmbare Kombination.

Gibt es eigentlich irgendwo vernünftige Assembler-Bücher für x86 mit NASM? Mir sind bisher nur unbrauchbare Schinken in die Finger gekommen. Entweder waren diese Teile für "Ich schreibe mal grade auf die Video-Hardware"-MS-DOS-Systeme, verschwenden dutzende von Seiten mit der Beschreibung nutzloser MS-DOS-Assembler-Entwicklungsumgebungen, sind für MASM konzipiert oder der Autor verwendet gar seinen "very own" Assembler-Dialekt, der mit Assembler eigentlich nichts mehr zu tun hat (etwa der oben genannte "HLA").
 
0815Chaot schrieb:
http://www.drpaulcarter.com/pcasm/ und anschließend http://www.int80h.org/bsdasm/ ist IMO eine ganz annehmbare Kombination.
Habe mir den ersten Link angeschaut, scheint Hand und Fuß zu haben. Das FreeBSD Assembler Tutorial ist mir schon am Anfang positiv aufgefallen (erster Post). Ich denke, ich werde Deinem Rat folgen.

0815Chaot schrieb:
Gibt es eigentlich irgendwo vernünftige Assembler-Bücher für x86 mit NASM? Mir sind bisher nur unbrauchbare Schinken in die Finger gekommen. Entweder waren diese Teile für "Ich schreibe mal grade auf die Video-Hardware"-MS-DOS-Systeme, verschwenden dutzende von Seiten mit der Beschreibung nutzloser MS-DOS-Assembler-Entwicklungsumgebungen, sind für MASM konzipiert
Genau das war mein Problem ;)

0815Chaot schrieb:
oder der Autor verwendet gar seinen "very own" Assembler-Dialekt, der mit Assembler eigentlich nichts mehr zu tun hat (etwa der oben genannte "HLA").
Hat mich auch nicht überzeugt, obwohl der Autor sich seiner Sache sehr sicher ist.


Bin voll und ganz Deiner Meinung, die beiden von Dir angeführten Links scheinen, zusammen mit dem englischen Wikibook, das Beste Material zu sein. Jezt fange ich, nach zwei Tagen querlesen und suchen, mal zu arbeiten/lernen an. :)
 
Vielleicht wurde das ja schon erwähnt, aaaber...

Ich persönlich finde Assembler lässt sich am leichtesten lernen, wenn man die Probleme der Tools umgehen kann. Wow, schlauer Satz ;) Was ich damit meine: Ich halte es für den Anfang wenig sinnvoll ein komplettes Programm in Assembler zu schreiben. Viel einfacher ist es, eine in Assembler geschriebene Routine in einem C Programm zu verwenden.

Da ich gerade Zeit habe, hier das Rezept: Man nehme eine Assembler Datei (z.B. assembler.S - wichtig ist die Endung), eine C Datei (z.B. main.c) und ein Makefile.

Im Makefile schreibt man dann etwas in dieser Art:

Code:
PROG= asmtest

OBJS= assembler.o main.o

$(PROG): $(OBJS)

clean:
  rm -f $(PROG) $(OBJS)

In der Assembler Datei assembler.S definiert man dann seine Assembler Funktion.

Code:
.text
	.globl	_meinefunktion
_meinefunktion:
; Stack-Frame anlegen
	stwu	r1, -64(r1)

; Hier kann man sich jetzt austoben.

; Der Stack Frame muss abgebaut werden ...
	lwz	r1, 0(r1)
; ... erst dann kann die Kontrolle an den Aufrufer zurückgegeben erden
	blr

In der C Datei kann man die Funktion dann einfach aufrufen:

Code:
void meinefunktion(void);

int
main (int argc, char **argv) {
  meinefunktion();
}

Das ganze funktioniert so mit GNU make unter Mac OS X auf 32-Bit PowerPC, d.h. <= G4. Mit minimaler Transferleistung des Lesers funktioniert das Prinzip aber auch auf x86 unter FreeBSD.
 
Zurück
Oben