Tutorial
Inlineassembler in FreeBASIC
von Volta | Seite 5 von 9 |
Inlineassembler und Variable / Konstanten in Funktionen und Subs
Konstanten
Da der FreeBASIC-Kompiler unsere Assemblerzeilen vor dem kompilieren mit AS noch einmal nachsieht, ist es nicht verwunderlich, dass die Anweisung Sub eax, minus zu Sub eax, 2468 vereinfacht wird. Der FreeBASIC-Kompiler trägt hier vor dem kompilieren durch AS den Wert ein. Eckige Klammern sind dabei fehl am Platze, da es hier nicht um den Inhalt einer Variablen geht.
Const minus As Integer = 2468
Dim Shared wert As Integer
Dim mult As Integer
Function mul10(ByVal zahl As Integer) As Long
Asm
mov eax, wert 'eax = wert
Sub eax, minus 'FBC trägt hier die Konstante ein
imul eax, [zahl] 'wert * zahl
mov [Function], eax 'als Funktionswert zurückgeben
End Asm
End Function
wert = 123456789
mult = 10
Print mul10(mult)
Sleep
Shared Variablen
Bei der Dimensionierung werden sie vom FBC im Speicherbereich angelegt und über ein Basis-Register adressiert (meist [ebp-48] o.ä.). D.h. mov eax, wert wird zu mov eax, [ebp-xx] und damit wird dann eindeutig auf den Inhalt der Variablen gezeigt, ohne das 'wert' in eckigen Klammern stehen muss. Wer gerne die eckigen Klammern macht und verdeutlichten will das es um den Inhalt der Variablen geht, sollte sie auch setzen.
Variablen ByVal
Der Wert der Variable 'zahl' wird der Funktion auf dem Stack übergeben. Mit dem Begriff 'zahl' wird also ein Speicherplatz (Adresse) verbunden. Will man an den Inhalt (Wert) müssen die eckigen Klammern angegeben werden.
Das gleiche gilt für Variable die in Funktionen und Subs angelegt (dimensioniert) wurden.
Variablen ByRef
Im Beispiel unten wird der Sub eine Variable Byref übergeben. Hier wird nicht der Wert, sondern die Adresse der Variable 'zahl' übergeben. Die Anweisung mov esi, [zahl] holt erst mal diese Adresse in das esi Register. Erst dann mit mov eax, [esi] wird der Variablenwert nach eax geladen.
Sub hole_wert (ByRef zahl As Long)
Asm
mov esi, [zahl] 'Adresse von zahl holen
mov eax, [esi] 'eax <- [zahl]
cdq 'Vorzeichenerweiterung auf edx - Register
mov ebx, 10 'ebx = 10
idiv ebx 'eax \ ebx
mov [esi], eax 'eax -> [zahl]
End Asm
End sub
Dim wert As Long = -123456789
Print wert
hole_wert wert
Print wert
Sleep
Dies ist die gleiche Vorgehensweise wenn
zahl as Long Ptr
definiert worden wäre. Um dies zu demonstrieren habe ich den Variablenwert durch 10 geteilt und speichere ihn an die Adresse zurück. Nach dem Aufruf der Sub hole_wert ist der Inhalt von 'wert' verändert (durch 10 geteilt).
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|