Paules-PC-Forum.de Anzeige:

Microsoft Windows Intune: PC-Verwaltung und -Sicherheit in der Cloud: Updateverwaltung, Anti-Virus und vieles mehr!


Zurück   Paules-PC-Forum.de > Programmierung > Sonstige Programmiersprachen

Sonstige Programmiersprachen Das Sammel-Forum für alle weiteren Programmiersprachen wie z.B. Assembler, Delphi, Pascal, C# (C-Sharp), Java usw.

EM-Tippspiel

Paule bei Facebook


Paule bei Twitter


Letzte Forenthemen
Gehe zum ersten neuen Beitrag PPF - Spiel "Wörter weiter...
Aufrufe: 26903, Antworten: 4218
Gehe zum ersten neuen Beitrag Algorithmen Teil IV...
Aufrufe: 3325, Antworten: 122
Gehe zum ersten neuen Beitrag Von Live CD Windowspfad...
Aufrufe: 309, Antworten: 19
Gehe zum ersten neuen Beitrag Bundesliga-Tippspiel Saision...
Aufrufe: 7641, Antworten: 185
Gehe zum ersten neuen Beitrag Captur 2.2 (Snow Leo)
Aufrufe: 19, Antworten: 0
Gehe zum ersten neuen Beitrag Captur 2.3 (Lion)
Aufrufe: 21, Antworten: 0
Gehe zum ersten neuen Beitrag Acer Aspire 8745ZG fährt...
Aufrufe: 56, Antworten: 6
Gehe zum ersten neuen Beitrag Rechner fährt herunter,...
Aufrufe: 145, Antworten: 9
Gehe zum ersten neuen Beitrag avs4you_com Lizenz oder Abo?
Aufrufe: 70, Antworten: 4
Gehe zum ersten neuen Beitrag PPF - Shoppingwahn
Aufrufe: 50942, Antworten: 1395
Zeige:





Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 11.09.2009, 22:15   #1 (Direktlink)
Super-Moderator
 
Benutzerbild von Frabbing
 
Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
Standard Deutscher Assembler-Crashkurs (32 Bit)

Kurs: Kleines Assembler-ABC (MASM32 oder JWASM, 32 Bit).

Das hier soll keine komplette Anleitung sein, um Assembler zu erlernen. Aber es sollte einem Programmierer, der einen Basic-ähnlichen-Dialekt verstehen kann gestatten, erste Assemblerprogrämmchen zu erstellen.

Zunächst einmal: Für MASM32-Assembler benötigt man für den Anfang nicht mal eine große Anzahl von Befehlen. Mit 10 Befehlen (insgesamt gibt es über 90) ist man erstmal schon gut bedient, alles andere ist zunächst unnütz, weil der MASM32 High-Level-Syntax (.while / .endw / .if / .endif usw.) unterstützt. Und davon ist einem Basic-Kenner schon vieles bekannt.

In Assembler gibt es Register, das sind Speicherbereiche, die 4 Bytes (Long-Integer) groß sind. Diese Register heißen eax, ebx, ecx, edx, edi und esi. Dann gibt es noch ebp und esp, die wir aber erstmal ausser acht lassen, weil Assembler diese beiden letzten Register noch andersweitig benutzt.
Bei einigen Registern können wir auch nur Teile davon benutzen, entweder 2 oder auch 1 ein Byte. Von Edi und esi können wir als Teile nur 2 Byte benutzen.
Hier das Schema der Register:



Eine wichtige Regel gibt es für Assembler: Es dürfen immer nur zwei Register mit der selben Byte-Größe zusammen benutzt werden! Aber was ist die Aufgabe eines Registers? Ein Register kann eine Zahl zwischenspeichern. Einige Assembler-Befehle können ein oder mehrere Register (untereinander) berechnen, vergleichen oder verändern. Darin besteht die ganze Technik.
Variablen gibt es natürlich auch. Hier ein paar Beispiele (das Semikolon ist ein Kommentarzeichen. Alles was dahinter steht, wird nicht mehr als Code interpretiert):

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/aus ein(em) Register verschieben oder einen Registerwert in ein anderes Register kopieren. Der linke Wert ist das Ziel, der rechte Wert ist die Quelle.

mov eax,4673052 ;die LongInt-Zahl 4673052 ins Register eax schreiben
mov ebx,eax ;den Wert aus eax nach ebx schreiben, in ebx steht jetzt auch 4673052
mov ax,20457 ;die Integer-Zahl 20457 nach ax
mov ah,238 ;und das Byte 238 nach ah
mov eax,variable ;variablenwert nach eax
mov variable,eax ;und umgekehrt


Add addiert zwei Werte miteinander und schreibt den neuen Wert in das linke Register:

mov eax,10 ;10 nach eax
add eax,20 ;20 addieren. Der Wert in eax ist jetzt 30
mov ecx,5 ;5 nach ecx
add eax,ecx ;ecx nach eax addieren. In eax steht jetzt der Wert 35


Sub subtrahiert zwei Werte und schreibt den neuen Wert in das linke Register:

mov eax,100 ;100 nach eax
sub eax,30 ;30 subtrahieren. eax jetzt 70
mov edx,10 ;10 nach edx
sub eax,edx ;10 subtrahieren. eax ist jetzt 60


Mul multipliziert zwei Werte und schreibt den neuen Wert nach eax. Bei einer Multiplikation wird eax mit dem Wert in einem anderen Register malgenommen.
Will man vorzeichenbehaftete Zahlen multiplizieren, dann muss anstatt dem mul das imul verwendet werden. mul ist in der Ausführung etwas schneller.

mov eax,7 ;7 nach eax
mov edx,5 ;5 nach edx
mul edx ;7 x 5. In eax steht jetzt 35, in edx steht 0


Div dividiert zwei Zahlen. An der Division sind drei Register daran beteiligt, eax, edx und ein Register ihrer Wahl. Edx muss Null sein!

mov eax,100 ;100 nach eax
mov edx,0 ;edx immer löschen!
mov ebx,3 ;3 nach ebx
div ebx ;eax geteilt durch ebx.
;Ergebnis (ganze Zahl) steht jetzt in eax, der Restwert in edx


So jetzt können wir schonmal rechnen.

Manchmal wünschen wir uns aber noch mehr Register. Die gibt's 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.

push eax ;eax auf den Stack legen
push ebx ;ebx auf den Stack


Mit pop können wir den Wert wieder von Stack runternehmen. Das muss aber in umgekehrter Reihenfolge passieren. So z.B.:

push eax
push ebx
push ecx
pop ecx
pop ebx
pop eax


Stellt euch den Stack als ein Stapel mit Briefen vor. Wenn ich drei Briefe daraufpacke, dann muss ich die beiden obersten erst wieder wegräumen, um an den ersten der drei Briefe zu gelangen.

Jmp gleicht dem Basic-Befehl GOTO und wird für Schleifen und Sprünge benutzt. Hier ein Beispiel, dass auch gleich zeigt, wie Labels (Sprungmarken) benutzt werden:

jmp hierhin

mov eax,0
mov ebx,0
hierhin:
mov ebx,0
Lea ist ähnlich wie mov. Nur übergibt lea nicht den Wert einer Variablen oder eines Registers, sondern den Zeiger auf die Variable/Register, also die Adresse der Variablen im Speicher:

.data ;Datenbereich kennzeichnen
vars dd 333,444,555,666 ;Hier 4 Longint's
.code ;Codebereich kennzeichnen
mov eax,vars ;In eax steht jetzt 333. Der erste Wert aus vars wird übergeben
lea edx,vars ;In edx steht jetzt der Zeiger auf vars
mov eax,[edx+0] ;333 nach eax. Das +0 könnte hier weggelassen werden
mov ebx,[edx+4] ;444 nach ebx
mov ecx,[edx+8] ;555 nach ecx
mov esi,[edx+12] ;666 nach esi
mov eax,222 ;222 nach eax
mov [edx+4],eax ;222 nach vars+4. Die 444 wird also durch 222
ausgetauscht.
Ups, die eckigen Klammern bedeuten, das nicht der Registerinhalt übergeben/gelesen wird, sondern der Inhalt, auf den das Register zeigt.

Invoke ist eigentlich kein Assembler-Befehl, sondern auch schon High-Level-Syntax. Invoke startet eine Prozedure oder eine Dll-Funktion. Dahinter übergeben werden alle nötigen Parameter.

invoke GetCurrentDirectory, 1024, addr speicherbereich


Wenn eine API einen Rückgabewert übergibt, steht er nach dem Aufruf immer im Register eax. "addr speicherbereich" übergibt übrigens den Zeiger auf einen Variablenspeicher, ist aber nur bei invoke gestattet.
Ebensogut hätte wir auch schreiben können:

lea edx,speicherbereich
invoke GetCurrentDirectory,255,edx


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 für den Anfang mit High-Level-Syntax machen. Ähnlich wie in Basic...

.while und .endw ist das Assemblergegenstück zum bekannten While und EndWhile.

mov eax,0
.while eax == 1
mov eax,[edx]
add edx,4

.endw

.break und .continue gibt es auch, genauso wie z.B. in XProfan.

Für Bedingungen und Verzweigungen gibt es .if, .elsif, .else und .endif.
Und das funktioniert so wie in vielen Basic-Dialekten.

.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:

== Gleich
!= Ungleich
> Größer als
>= Größer gleich
< Kleiner als
<= Kleiner gleich
! Logisches NOT
&& Logisches AND
|| Logisches OR


Sollen mehrere Bedingungen abgefragt werden, dann sollten die einzelnen Bedingungen in Klammen stehen, z.B.:

.if ((eax==0) && (ebx>=0))

Dann gibt es noch eine .repeat / .until Schleife, eine fußgesteuerte Schleife. Die wird so lange ausgeführt, bis die Bedingung hinter .until
eintritt. In diesem Fall also, bis ebx gleich Null ist:

.repeat
;irgendein Sourcecode
.until ebx==0

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 für den Anfang Unnötige weggelassen. Das gibt dem User die Möglichkeit, von Grund auf anzufangen. Es gibt noch viele viele Befehle (Mnemonics) mehr, aber die meisten sind wirklich durch die konfortable High-Level-Syntax
ersetzt worden. Anfänger jedenfalls werden mit den 10 beschriebene Befehlen schon gut zurecht kommen, und den Rest erledigt die alltägliche Routine.

Ein gute Auflistung aller Assembler-Befehle gibt es hier: http://www.jegerlehner.ch/intel/IntelCodeTable.pdf

Ich habe im ganzen Kurs darauf verzichtet, irgendwelche Optimierungen vorzunehmen (xor eax,eax anstatt mov eax,0), nur weil es ein paar Taktzyklen schneller ist. Assembler ist wirklich so schnell und die neuen Prozessoren arbeiten so gut, das solche Optimierungen heute kaum noch was hermachen. Einsteiger in Assembler sollten sich darum nicht damit belasten.

Ich wünsche viel Spaß beim Lernen!

(w) Frank Abbing

__________________
Gruß, Frank


Webpage http://frabbing.bplaced.net
mit Freeware - Tools, Spiele und Grafiken.

Geändert von Frabbing (20.08.2010 um 22:14 Uhr) Grund: Bild neu verlinkt
Frabbing ist offline   Mit Zitat antworten
Werbung

Windows 7 Tipps und Tricks in Bildern

Alt 12.09.2009, 13:06   #2 (Direktlink)
MoRoGeP-Träger 2011
 
Benutzerbild von horsthorn
 
Registriert seit: 06.02.2009
Ort: Heidelberg
Alter: 71
Beiträge: 1.877
Daumen hoch

@Frank

Endlich - da habe ich schon lange drauf gewartet. Einen Crash-Kurs für Menschen wie mich. (Miese Englisch-Kenntnisse und nur 8 Jahre Volksschule) - Habe mir die Geschichte rauskopiert und werde das jetzt ausdrucken und heute abend anfangen, zu büffeln !
Danke
__________________
Gruss, horst
Computer werden kleiner und kleiner, bald verschwinden sie völlig.
(Ephraim Kishon 1924-2005)

Win7-Home-Premium 32-Bit - XProfan12.0ß-S14 - Chrome-18.0.1025.142 m
http://www.web-treffpunkt.de
horsthorn ist offline   Mit Zitat antworten
Alt 12.09.2011, 15:29   #3 (Direktlink)
Erfolgreich angemeldet
 
Registriert seit: 07.09.2011
Alter: 18
Beiträge: 13
Standard

Falls sich jemand dafür richtig interessiert, kann ich im nur folgendes Buch empfehlen. (Sogar auf Deutsch)

Assembler: Maschinennahes Programmieren von Anfang an. Mit Windows-Programmierung: Amazon.de: Reiner Backer: Bücher
uran0s ist offline   Mit Zitat antworten
Alt 13.09.2011, 18:33   #4 (Direktlink)
Super-Moderator
 
Benutzerbild von Frabbing
 
Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.094
Standard

Seltsamerweise ist auf dem Titel aber kein Assemblercode zu sehen, sondern C++.
__________________
Gruß, Frank


Webpage http://frabbing.bplaced.net
mit Freeware - Tools, Spiele und Grafiken.
Frabbing ist offline   Mit Zitat antworten
Antwort

  Paules-PC-Forum.de > Programmierung > Sonstige Programmiersprachen

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Deutscher Assembler-Crashkurs Frabbing Schreibstube 1 25.09.2009 11:32
Deutscher Assembler-Crashkurs Paule f.) Programmierung 0 25.09.2009 11:31
crashkurs in internetgeschwindigkeiten DNS Netzwerke 3 02.02.2009 00:28
Assembler Destruction Sonstige Programmiersprachen 2 29.10.2007 22:43
Assembler ISR Don_Pazo Sonstige Programmiersprachen 1 04.02.2007 19:59



Alle Zeitangaben in WEZ +2. Es ist jetzt 04:54 Uhr.


Powered by vBulletin® Version 3.8.7 (Deutsch)
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Powered by vBCMS® 2.7.0 ©2002 - 2012 vbdesigns.de
(c) Paules-PC-Forum.de

::: Impressum :::

Search Engine Optimization by vBSEO 3.3.2