ASM Fehler

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Der Eisvogel

Betreff: ASM Fehler

BeitragMi, Okt 12, 2011 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo

Ich führe derzeitig Krieg mit ASM. Folgenden Code möchte ich ausführen:
Code: [AUSKLAPPEN]
format MS COFF
public _OpenABC
_OpenABC:
   push ebp
   mov ebp,esp
   push eax
   push ebx
   push ecx
   push edx
   mov edx,[ebp+18h]
   mov eax,[ebp+10h]
   mov ebx,[ebp+0Ch]
   push eax
   mov eax,[ebp+08h]
   push ebx
   push 0
   push eax
   mov ecx,[ebp+14h]
   call edx
   pop edx
   pop ecx
   pop ebx
   pop eax
   mov esp,ebp
   pop ebp
ret 014h


Hiermit wird die Funktion eingebunden:
BlitzMax: [AUSKLAPPEN]
Extern
Function OpenABC(id:Int, x:Float, y:Float, handle:Int, func:Int) = "OpenABC"
End Extern


Das Problem ist, nicht, dass es nicht funktioniert, sondern, dass irgend etwas kaputt geht, und zwar eine Variable die an ganz anderer Stelle im Programm benutzt wird, in BlitzMax. Zur Sicherheit, habe ich die Register mal abgesichert, aber auch das bringt keinen Erfolg. Auch durch Weglassen des Call-Befehls, um Fehlfunktionen der aufgerufenen Funktion zu vermeiden, ändert sich nichts. Somit hab ich das Problem auf den oben genannten Code isoliert. Aber ich habe keine Ahnung was daran jetzt falsch sein soll. Ich benutzte mehrere Code-Fetzen dieser Art und alle funktionieren problemlos. Einzige Besonderheit von diesem Fetzen ist, dass es 5 Parameter hat, alle anderen haben nur 4, und ich übergebe floats, anstatt nur ints, aber das sollte nach meinem wissen in ASM bei dieser Anwendung keine Rolle spielen.
Irgendwas muss auf jeden Fall dafür sorgen, dass eine Fremdvariable überschrieben wird, denn ein ganz bestimmter String aus meinem Hauptprogramm wird mit dem Aufruf dieser Funktion unbrauchbar und verursacht beim Verwenden der Variable einen Error. Sieht jemand irgendeinen Fehler in diesem ASM Code?

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Thunder

BeitragMi, Okt 12, 2011 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiß ja nicht, wo dich das "call edx" hinführt, aber wenn zu einer Blitzmax-Funktion, dann musst du danach die Parameter vom Stack nehmen. Der der aufruft, nimmt danach auch die Parameter vom Stack. Deswegen würde ich es auch mit einfachem "ret" ohne Parameter versuchen:

Code: [AUSKLAPPEN]
format MS COFF
public _OpenABC
_OpenABC:
   push ebp
   mov ebp,esp
   push eax
   push ebx
   push ecx
   push edx
   mov edx,[ebp+18h]
   mov eax,[ebp+10h]
   mov ebx,[ebp+0Ch]
   push eax
   mov eax,[ebp+08h]
   push ebx
   push 0
   push eax
   mov ecx,[ebp+14h]
   call edx
   add esp, 16
   pop edx
   pop ecx
   pop ebx
   pop eax
   mov esp,ebp
   pop ebp
ret
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Der Eisvogel

BeitragMi, Okt 12, 2011 21:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Super, wie kann ich dir nur danken! Ich mach da schon ewig dran rum. Das "call edx" führt aber zu einer Funktion die die Parameter selbst vom Stack holt. So hatte ich es auch gelernt, deswegen bin ich garnicht auf die Idee gekommen. Ich hab also jetzt das "ret" ohne Parameter, aber die Parameter hol ich noch nicht vom Stack, das macht halt wie gesagt die Funktion die ich aufrufe. Keine Ahnung warum, aber so steht es in IDA Pro.

Aber das ist echt Wahnsinn wie ASM einen da wütend machen kann. Ich war schon kurz davor das ganze Projekt wegen dem Mist abzubrechen, aber jetzt funktioniert es. Du bist mein Retter. Danke, danke, danke!
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group