Tutorial
Inlineassembler in FreeBASIC
von Volta | Seite 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':
- als Quelle kommen Register, Speicherstellen [Variablen] und Konstanten in Frage,
- als Ziel sind nur Register und Speicherstellen [Variablen] möglich,
- wobei nicht beide, Ziel und Quelle, Speicherstellen sein dürfen.
- In jedem Fall müssen Ziel und Quelle die gleiche Größe (Anzahl Bit) haben.
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 Pointer (Zeiger auf Adresse), aber warum 'dword'. Die Variable 'Zahl' war als integer deklariert, dann sollte es doch 'integer 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:
- mov eax,0 setze eax-Register zu 0
2Byte für den Befehl 'mov eax' + für die Konstante 0 - xor eax,eax Registerwert mit sich selbst EXOR ergibt immer 0
1 Byte für den Befehl 'xor eax,eax' oder.. - sub eax,eax Registerwert von sich selbst abgezogen ergibt immer 0
1 Byte für den Befehl 'sub eax,eax'
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.
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|