Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [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 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).

 

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