Deutsch
Bücher & Tutorials

Assembler Kurs - Kleines Assembler ABC

 
Kurs: Kleines Assembler ABC.
Das hier soll keine komplette Anleitung sein, um Assembler zu erlernen.
Aber es sollte einem Profan-User gestatten, erste Assemblerprogämmchen zu erstellen.

Zunächst einmal: Für Assembler benötigt man keine grosse Anzahl von Befehlen, mit 10 Befehlen (insgesamt gibt es über 90) ist man schon gut bedient, alles andere ist unnütz, weil der MASM32 Assembler High-Level-Syntax (.while / .endw / .if / .endif usw.) unterstützt. Und davon ist einem Profan-User schon das meiste bekannt.

In Assembler gibt es Register, das sind Speicherbereiche, die 4 Byte (Long-Int) groß sind. Einige Register dürfen wahlweise auch nur 1 oder 2 Bytes groß sein.
Diese Register heißen eax, ebx, ecx, edx, edi und esi. Dann gibt es noch ebp, das sie aber erstmal ausser acht lassen sollten.
Und es gibt noch esp, das ist auch erstmal tabu für sie. Zudem benutzt Assembler esp als Stackpointer.

Diese Register können auch als Integer oder Byte vorkommen.
Als Integer heißen sie dann ax, bx, cx, dx, di und si.

Als Byte, da gibt es einmal das HiByte und das LoByte, in diesem Format heißen sie dann ah und al, bh und bl, ch und cl und noch dh und dl. Edi und esi können nur als Long-Int oder Integer benutzt werden.

Es dürfen immer nur zwei Register mit der selben Byte-Größe zusammen benutzt werden !!!

Die Aufgabe eines Registers:
Ein Register kann eine Zahl zwischenspeichern und der Assembler rechnet bei einigen Befehlen mit den Werten einiger Register aktualisiert diese selbstständig. Die Register sind also zum speichern und zum rechnen da.
Variablen gibt es natürlich auch.



Hier ein paar Beipspiele:
KompilierenMarkierenSeparieren
Werte     dd 0,0,4,6,874,414425  ;6 Long-Ints
Zahlen    dw 45,263,4663         ;6 Integer
dw 364,67,3
Nochmehr  db 4,5,1,90,34         ;5 Bytes
Text      db Hallo,0           ;Und ein 6 bytes langer String (immer mit Nullbyte !!!)

Kommen wir zum ersten und wichtigsten Befehl: mov.
Mov steht für Move und heißt verschiebe. Man kann damit Zahlen in ein Register verschieben oder einen Registerwert in ein anderes Register kopieren. Der linke Wert ist das Ziel, der rechte Wert ist die Quelle.
KompilierenMarkierenSeparieren
Add addiert zwei Werte miteinander und schreibt den neuen Wert in das linke Register:
KompilierenMarkierenSeparieren
Sub subtrahiert zwei Werte und schreibt den neuen Wert in das linke Register:
KompilierenMarkierenSeparieren
Mul multipliziert zwei Werte und schreibt den neuen Wert nach eax. Bei einer Multiplikation dürfen nur eax und edx verwendet werden.
Will man vorzeichenbehaftete Zahlen multiplizieren, dann muß anstatt dem mul das imul verwendet werden. mul ist in der Ausführung aber schneller..
KompilierenMarkierenSeparieren
Div dividiert zwei Zahlen. An der Division sind drei Register daran beteiligt, eax, edx und ein Register ihrer Wahl. edx muß Null sein !
KompilierenMarkierenSeparieren
So jetzt können wir schonmal rechnen.

Manchmal wünschen wir uns aber noch mehr Register. Die gibts aber nicht. Aber wir können den Stack als Registerablage mißbrauchen.

Mit push legen wir eine Variable oder ein Register auf dem Stack ab.
KompilierenMarkierenSeparieren
Mit pop können wir den Wert wieder von Stack runternehmen. Das muß aber in umgekehrter Reihenfolge passieren.
KompilierenMarkierenSeparieren
Stellt euch den Stack als ein Stapel mit Briefen vor. Wenn ich drei Briefe daraufpacke, dann muß ich die beiden obersten wieder wegräumen, um an den ersten der drei Briefe zu gelangen.

Jmp gleicht Profans Goto und wird für Schleifen und Sprünge benutzt.
KompilierenMarkierenSeparieren
Lea ist ähnlich wie mov. Nur übergibt lea nicht den Wert einer Variablen oder eines Registers, sondern den Zeiger auf die Variable/Register.
KompilierenMarkierenSeparieren
Ups, die eckigen Klammern bedeuten, das nicht der Registerinhalt übergeben wird, sondern der Inhalt, auf den das Register zeigt.

Invoke ist eigentlich kein richtiger Befehl, sondern auch schon High-Level-Syntax. invoke startet eine API oder eine Dll-Funktion. Übergeben werden alle nötigen Parameter.
KompilierenMarkierenSeparieren
Wenn die API einen Rückgabewert übergibt, steht er nach dem Aufruf im Register eax.
addr speicherbereich übergibt den Zeiger auf einen Variablenspeicher, ist aber nur bei invoke gestattet.
Ebensogut hätte man schreiben können:
KompilierenMarkierenSeparieren
So, das wären die versprochenen 10 Befehle
Aber wie können wir jetzt Register und Variablen vergleichen und Bedingungen und Verzweigungen programmieren ?
Ganz einfach, den Rest können wir mit High-Level-Syntax machen. Ähnlich wie in Profan...

.while und .endw ist das Assemblergegenstück zu Profans While und EndWhile.
KompilierenMarkierenSeparieren
mov eax,0

.while eax == 1

    mov eax,[edx]
    add edx,4

.endw


.break und .continue gibt es auch, genauso wie in Profan.

Für Bedingungen und Verzweigungen gibt es .if, .elsif, .else und .endif.
Und das funktioniert so wie in Profan
KompilierenMarkierenSeparieren
.if eax==0

    mov ebx,1

.elseif ecx==0

    mov edx,1

.else

    mov ebx,2
    mov edx,2

.endif


Das == ist übrigens das Gleichzeichen.Weitere Vergleichsoperatoren sind:
KompilierenMarkierenSeparieren
Sollen mehrere Bedingungen abgefragt werden, dann sind die einzelnen Bedingungen in Klammen zu setzen, z.B. .if (eax==0) && (ebx>=0).

Ein Synonym für Profans whileloop gibt es ebenfalls.Das geht mittels einer .repeat / .until Schleife:
KompilierenMarkierenSeparieren
Eine .repeat / .until Schleife kann ebenfalls mittels .break verlassen, und mittels .continue neu gestartet werden.

So, hier endet unser Assembler Crashkurs.
Ich hab wirklich alles Unnötige weggelassen. und somit dem User die Möglichkeit gegeben, von Grund auf anzufangen.
Es gibt noch viele viele Befehle mehr, aber die meisten sind wirklich durch konfortablen High-Level Befehle ersetzt worden.
Ein gute Auflistung aller Befehle gibt es hier: [...]  (auch im Anhang zum Runterladen)

Ich habe hier auch darauf verzichtet, irgendwelche Optimierungen vorzunehmen (xor eax,eax anstatt mov eax,0), nur weil es ein paar Taktzyklen schneller ist. Assembler ist wirklich so sauschnell und die neuen Prozessoren arbeiten so gut, das solche Optimierungen kaum noch was hermachen.

Es lohnt sich , das komplette MASM32 Paket (Freeware) runterzuladen.

Moderation:

Die einfachste Möglichkeit Inline-Assembler in seinen Programmen zu verwenden, ist in nativen Funktionen: [...] 

Beispiel:
KompilierenMarkierenSeparieren

147 kB
Hochgeladen:22.08.2005
Ladeanzahl601
Herunterladen
 
24.06.2004  
 



Zum Buch


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

7.588 Betrachtungen

Unbenanntvor 0 min.
Member 640534330.01.2022
Sven Bader16.09.2021
p.specht10.06.2021
Axel25.11.2020
Mehr...

Themeninformationen

Dieses Thema hat 1 Teilnehmer:

Frank Abbing (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie