Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

Inlineassembler in FreeBASIC

von RedakteurVoltaSeite 3 von 9

Was passiert hier in den Assemblerzeilen?

Dim zahl as Long
asm
 mov eax, 1234567890
 mov [Zahl], eax
end asm
print zahl
sleep
end

Der mit Abstand wichtigste und häufigste Assemblerbefehl ist 'mov Ziel, Quelle' .
Der Befehl deutet bereits recht deutlich das englische Wort move (bewegen) an, was in diesem Fall aber nicht ganz den Tatsachen entspricht. Tatsächlich wird der Quelloperand in Ziel kopiert, und in Quelle nicht gelöscht.
Die Quelle ist hier eine Konstante in Form einer dezimal angegebene Zahl von 1.234.567.890 . Dieser Wert wird nach Ziel 'eax' bewegt. In Basic hätte man ja eax=1234567890 schreiben können, das verdeutlicht das Prinzip dieses Befehls, würde aber eine Fehlermeldung ergeben. In Assembleranweisungen ist 'eax' keine Variable sondern ein Speicherplatz im Prozessor, ein sogenanntes Register. Dieses Register kann eine 32Bit Ganzzahl (keine Nachkommastellen) speichern.
In der nächsten Assemblerzeile steht wieder ein 'mov' Befehl, aber mit anderer Quelle und Ziel. Hier ist die Quelle das eax - Register und Ziel ist [Zahl]. 'Zahl' wurde vorher im Basicquelltext als Variable vom Typ integer (32Bit) definiert. Die eckigen Klammern um [Zahl] deuten an, dass es uns hier um den Inhalt der Variable 'Zahl' geht. Der Inhalt ist an der Speicherstelle gespeichert, deren Adresse der Basiccompiler ihr zugewiesen hat. Und an diese Adresse soll der Inhalt von 'eax' kopiert werden.

Merke zu 'mov Ziel, Quelle':

Diese beiden Zeilen in Inlineassembler

asm mov eax, 1234567890
asm mov [Zahl], eax

machen das gleiche wie

Zahl = 1234567890

als Basiczeile. Dann sollte

asm  mov [Zahl], 1234567890 '<-Fehlermeldung

doch auch das gleiche tun. Wer es ausprobiert wird eine Fehlermeldung erhalten.
Nicht das es so nicht möglich ist, sondern weil der Basic-Compiler die Adresse von 'Zahl' angibt aber nicht die Anzahl Byte die zu speichern sind. Hier muss von uns ein Zusatz geschrieben werden der eindeutig die Größe der Speicherstelle kennzeichnet.

asm  mov dword ptr [Zahl], 1234567890

Moment, 'ptr' steht hier für BefehlsreferenzeintragPointer (Zeiger auf Adresse), aber warum 'dword'. Die Variable 'Zahl' war als integer deklariert, dann sollte es doch 'Befehlsreferenzeintraginteger ptr' sein? Das ist wie bei Sprachen oder Dialekten, alle meinen die gleiche Sache (32Bit-Wert) und jeder hat einen anderen Begriff dafür (long, integer, dword).

Anzahl Bit (Byte)    in freeBASIC     im Inlineassembler
  8Bit (1 Byte)         byte ptr          byte ptr
 16Bit (2 Byte)         short ptr         word ptr
 32Bit (4 Byte)        long ptr          dword ptr
 64Bit (8 Byte)        longint ptr       qword ptr

Na gut, aber warum muss dieser Zusatz nicht bei

..
 mov [Zahl], eax
..

angegeben werden?
Hier erkennt der Assembler durch 'eax' als 32Bit-Register die Datengröße.
Und wenn die nicht nach 'Zahl' passt?
Dann erkennt der Basic-Compiler das Problem und gibt eine Fehlermeldung!
Diese Schreibweise trifft, aus dem gleichen Grund, auf viele Assemblerbefehle zu.

Tricks in Assembler.

Schon in den ersten Assemblerprogrammen mit den Ururur..ahnen der heutigen Prozessoren kamen die ersten Tricksereien bei der Anwendung der Assembleranweisungen auf.
Recht gut erinnere ich mich daran wie ich damals versuchte mit 1024 Byte Speicher sinnvolle Programme zu erstellen. Not (an Speicherplatz) macht erfinderisch, also wurde versucht, möglichst kurze Befehle (1-Byte-Befehle) zu verwenden.

Beispiele:

Heute mangelt es nicht mehr an Speicherplatz, aber man versucht gerade in Assembler immer schnellere Routinen zu schreiben und da sind meist kurze Befehle auch die schnelleren.

 

Gehe zu Seite Gehe zu Seite  1  2  3  4  5  6  7  8  9  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 09.08.2008 von RedakteurVolta angelegt.
  • Die aktuellste Version wurde am 09.12.2015 von RedakteurVolta gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen