Entwickler-Ecke
Algorithmen, Optimierung und Assembler - C++ zu Delphi schon wieder
goose - Mi 07.09.05 02:03
Titel: C++ zu Delphi schon wieder
Hallo,
jetzt hats mich so richtig erwischt.
Soweit gehts ein bischen voran mit eurer Hilfe und viel viel Zeit und ausprobieren.
Aber damit komm ich nu wirklich nicht klar :
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| // send the request __asm { push eax call next next: pop eax mov dwError,eax pop eax } *((DWORD *) m_pView) = dwError; // DWORD |
Also wie ich das nach Delphi bekomme hab ich schon rausbekommen,
aber da kommt ne Fehlermeldung das "next" ein undefinierter Bezeichner is ???
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| asm push eax call next next: pop eax mov dwError,eax pop eax end; DWORD(m_pView) := dwError; |
Oder mach ich da irgendwas falsch ?
Ob die letzte Zeile so hundertprozentig richtig ist weiss ich auch noch nicht.
Jedenfalls meckert da Delphi erst mal nicht.
Kann mir hier mal jemand helfen ?
Hoffe Ihr seit nicht auch so Ratlos wie ich ?
Danke
Matthias
Moderiert von
raziel: Code- durch Delphi-Tags ersetzt.Moderiert von
raziel: Topic aus Sonstiges verschoben am Mi 07.09.2005 um 09:57
Allesquarks - Mi 07.09.05 10:52
So wie ich das sehe ist, ist das next ein Label also eine Sprungaddresse. In Delphi wird das glaube ich über ein @@next: gemacht. Was mich wundert ist, dass das Label über call aufgerufen wird und dann auch direkt dahinter steht.
DBR - Mi 07.09.05 21:08
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| asm push eax call @next @next: pop eax mov dwError,eax pop eax end; DWORD(m_pView) := dwError; |
aber den praktischen Nährwert sehe ich nicht, denn
Delphi-Quelltext
1: 2: 3: 4: 5:
| asm mov dwError,eax pop eax end; DWORD(m_pView) := dwError |
wäre doch das gleiche
SMO - Do 08.09.05 00:58
Nein. So ist es korrekt, man beachte die Kommentare:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| asm push eax call @next @next: pop eax mov dwError,eax pop eax end; PDWORD(m_pView)^ := dwError; |
Über den Sinn dieses Codeschnipsels lässt sich streiten. In Delphi muss man den ursprünglichen Wert von eax gar nicht sichern, und die Adresse von @next bekommt man auch anschaulicher mit "mov eax,offset @next".
goose - Do 08.09.05 01:07
Hallo zusammen,
ich danke Euch allen für Eure Hilfe !!!
Ich habs jetzt so und es geht. Ob das nun Sinnvoll oder ob da irgendwelche anweisungen doppelt oder sinnlos sind kann ich nicht sagen. Bin ja froh das das geht.
mov, pop, push, keine Ahnung was das ganze bewirkt.
Ich hab mit Delphi erst vor etwa 1- 1/5 Jahren angefangen und bin schon froh das ich damit ein bischen zurecht komme. Wie man sieht hab ich auch die ganze Zeigersache noch nicht so richtig begriffen, aber ich lerne es irgendwann, da bin ich sicher !
Ich geb einfach nicht auf bis ich ein Lösung für ein Problem gefunden habe und damit bin ich bisher immer gut gefahren :-)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| asm push eax call @next @next: pop eax mov dwError,eax pop eax end; PDWORD(m_pView)^ := dwError; |
Also so geht es jetzt. Warum auch immer :-)
DANK EUCH NOCHMAL !!!
Matthias
uall@ogc - Do 08.09.05 01:31
Delphi-Quelltext
1: 2: 3: 4: 5:
| asm call @next @next: pop dword ptr [dwerror] end; |
das ist bisl kürzer
und @SMO das wird schon seinen sinn haben
denn ein
ist statisch, die funktion kann dynamisch aufgerufen werden, denk e mal das ist für einen execrypter oder packer oder sowas
das ganze in asm:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| asm push ecx push eax call @next @next: pop eax mov dword ptr [dwerror], eax mov ecx, dword ptr [m_pView] mov [ecx], eax pop eax pop ecx end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!