Español
Ensamblador Foro

ASM: StdCall con cualquier vielen Parametern

 
- Página 1 -



Uwe
''Pascal''
Niemeier
Hi Personas!

In el Hoffnung, daß hier el una u otros ASM-Kenner mitliest, lugar Yo veces 'ne Cuestión:

Yo búsqueda una Möglichkeit, una StdCall-Función con cualquier vielen Parametern aufzurufen.
Das el grundsätzlich posible es, zeigt dieses Snippet:
TestX proc ;----------------------------------------------------
push ebp
mov eax,ebp
sub eax,esp
sub eax,64
pop ebp

.IF eax==4

    ret 4

.ELSEIF eax==8

    ret 8

.ELSEIF eax==12

    ret 12

.ELSEIF eax==16

    ret 16

.ENDIF

TestX endp;-----------------------------------------------------

Das klappt sowohl como Función en uno dll como auch como "Embedded ASM" direkt en Profano:
window 800,600
declarar a#:dim a#,48
long a#,0=734366549,1088979908,83395421,79824245
long a#,16=-2095256832,91556088,-352319294,217613074
long a#,32=214041973,-2096567552,58003704,4290
imprimir call(a#,1)
imprimir call(a#,1,2)
imprimir call(a#,1,2,3)
imprimir call(a#,1,2,3,4)
waitinput

Nun denke Yo aber, lo debería auch einfacher y universeller ir, indem uno por verbiegen de Pointern con un einfachen RET auskommt y se el Bandwurm de IF-Abfragen sparen kann (RET akzeptiert sí no Register como Parámetro).
Stehe como allerdings algo en el Schlauch, qué Stack-Manipulationen betrifft.

Kann alguien helfen?

[OFFTOPIC]BTW: @ IF: Hab's irgendwie no hingekriegt, dieses Posting bajo "Assembler" abzulegen [/OFFTOPIC]


SeeYou
Pascal
 
05.11.2010  
 



« Dieser Contribución wurde como Solución gekennzeichnet. »

¡Hola Uwe, es gelungen...

o

o

Ablauf fehlerfrei getestet bajo 32Bit WinXP XProfan 11.

Man muss sólo el Rücksprungandresse sichern y esta después de künstlichem Reduzieren des Stacks a el neue Stackposition ablegen.

Würde mich freuen si así algo anfangen kannst.
 
05.11.2010  
 



Yo glaube Yo saber ya cómo hacerlo ... Yo teste el heute Abend igual veces y berichte. (sin Ifs, Schleifen y jmp eax*sonstwas)

[OFFTOPIC]Hab el Topic por DB después de Ensamblador movido. Als Yo eben probierte aquí en bajo Ensamblador Topics a erzeugen (auch gleichnamige) funktionierte el problemlos. Was genau war passiert el se el Thema hier no ablegen ließ?[/OFFTOPIC]
 
05.11.2010  
 



¡Hola Uwe, es gelungen...

o

o

Ablauf fehlerfrei getestet bajo 32Bit WinXP XProfan 11.

Man muss sólo el Rücksprungandresse sichern y esta después de künstlichem Reduzieren des Stacks a el neue Stackposition ablegen.

Würde mich freuen si así algo anfangen kannst.
 
05.11.2010  
 




Uwe
''Pascal''
Niemeier
Hi IF!

Klasse! Haut hin!

El Función se siempre sólo una konstanten Valor zurückgeben, aber eben en cualquier vielen Parametern, unabhängig de deren Inhalt.

Yo voluntad lo una universelle Dummy-Función para OLE-Interfaces remendar (war sí klar )
Leider klappt eben el todavía no, wahrscheinlich porque gerade como mi Berechnung el Rücksprungadresse/Parameterzahl no stimmt. Aber el kriege Yo fuera...

Gracias para deine Ayuda!

PS: Wenn du dies liest ha el Posting geklappt

SeeYou
Pascal
 
07.11.2010  
 



Juhu ^ ^

Stumpf dijo reichts scheinbar si al Funktionkopf
es en el Stack para ret 0 a präparieren en egal como vielen Params.
 
07.11.2010  
 




Uwe
''Pascal''
Niemeier
Apéndice @ IF:

Trotz deiner Solución voluntad Yo esta Technik probablemente no uso puede
Anscheinend kann lo vorkommen, daß el Aufrufer ( en mi caso Windows incluso, el el Métodos meines Interfaces aufruft ) antes el Funktionsaufruf Werte para el Eigenbedarf en el Stack pusht, el nada como Parámetro para el Función vorgesehen son.
Und así Es el Parameterberechnung por ebp minus esp  hinfällig
Also es weiterhin nötig, para jede Parameterzahl una propio Dummy-Función bereitzustellen. Aber el Intento war's wert!

SeeYou
Pascal
 
10.11.2010  
 



Sorry, como Yo ad hoc auch no Concepto - besonders si la Aufruferfunktion auch con el Stack werkelt.

Yo podría me todavía vorstellen el "Win" el Differenz en solch Fall en un Register mitliefert oder por Stack - como una Abhängigkeit herauszufummeln es aber determinado bastante "irre".
 
10.11.2010  
 



Obwohl...

Si usted veces lauter Longs vom Stack simplemente frech en una Debugviewer puschst ...

vlt. klappts sí si uno más que sólo 1 Largo zurücksichert.
 
10.11.2010  
 




Uwe
''Pascal''
Niemeier
Hi IF!

Yo glaube inzwischen no mehr, daß el Ganze machbar es:
Jede Método ha nun veces una feste Anzahl Parámetro, y derjenige, el el Métodos bereitstellt (y por lo tanto es sí), ha eben dafür Sorge a tragen, daß esta Parámetro korrekt bearbeitet voluntad. ¿Por qué debería se M$ el Mühe hacer, esta Anzahl irgendwo einzubauen? Und si, wäre lo eben undokumentiert y así seeeehr wackelig...La idea con el MultiParameter-Método es sí en mi Mist gewachsen
Außerdem hält se el Aufwand en reciente Technik auch en Grenzen; hier una Versión des OLE-RTF-Controls:
window 800,600
 $H Windows.ph
 $H RichEdit.ph
usermessages 16'--WM_CLOSE
def StgCreateDocfileOnILockBytes(4) !"ole32","StgCreateDocfileOnILockBytes"
def CreateILockBytesOnHGlobal(3) !"ole32","CreateILockBytesOnHGlobal"
def &NI $80004001'--Not Implemented
def &OK 0'----------OK

proc CreateIMD'---------------------------------------InterfaceMethodDummy

    var a&=~GlobalAlloc(0,8)
    byte a&,0=$B8'-------mov eax,&(2)
    long a&,1=&(2)'------Rückgabe: vorgegebene Konstante
    byte a&,5=$C2'-------ret &(1)*4+4
    word a&,6=&(1)*4+4'--Anzahl Parámetro * 4 + "This"-Pointer
    volver a&'-----------Fertige Función en el Speicher
    '--PS: Mit unos pocos NOP's para Verschieben el Platzhalter paßt alles en 1 Línea con 4 LongInts

ENDPROC'------------------------------------------------------------------

proc GetNewStorage'------------------------------------------GetNewStorage

    parámetros IFace&,IStorage&
    declarar ILockBytes&
    CreateILockBytesOnHGlobal(0,1,addr(ILockBytes&))
    StgCreateDocfileOnILockBytes(ILockBytes&,$1012,0,IStorage&)
    call(long(long(ILockBytes&,0),8),ILockBytes&)'--ILockBytes::Release
    volver &OK

ENDPROC'------------------------------------------------------------------

declarar VTable#:dim VTable#,60'-----------------------IRichEditOleCallback-Interface
long VTable#, 0=CreateIMD(1,&NI)'-------------QueryInterface
long VTable#, 4=CreateIMD(0,&NI)'-------------AddRef
long VTable#, 8=CreateIMD(0,&NI)'-------------Release
long VTable#,12=procaddr("GetNewStorage",2)'--GetNewStorage
long VTable#,16=CreateIMD(3,&NI)'-------------GetInPlaceContext
long VTable#,20=CreateIMD(1,&NI)'-------------ShowContainerUI
long VTable#,24=CreateIMD(3,&OK)'-------------QueryInsertObject
long VTable#,28=CreateIMD(1,&NI)'-------------DeleteObject
long VTable#,32=CreateIMD(5,&OK)'-------------QueryAcceptData
long VTable#,36=CreateIMD(1,&NI)'-------------ContextSensitiveHelp
long VTable#,40=CreateIMD(3,&NI)'-------------GetClipboardData
long VTable#,44=CreateIMD(3,&NI)'-------------GetDragDropEffect
long VTable#,48=CreateIMD(4,&NI)'-------------GetContextMenu
long VTable#,52=VTable#
var IFace&=VTable#+52
var Edit&=create("richedit",%hwnd,"",20,20,500,500)
sendmessage(Edit&,~EM_SETOLECALLBACK,0,IFace&)'---EM_SETOLECALLBACK
var Expediente$=loadfile$("RTF con Objekten wählen","*.rtf")
Rtf("LoadRTF",Edit&,Expediente$)

mientras que 1

    waitinput
    caso %umessage=16:romper

endwhile

sendmessage(Edit&,~EM_SETOLECALLBACK,0,0)
destroywindow(Edit&)
disponer VTable#
'--Hier müßten eigendlich todos Métodos-Dummys con ~GlobalFree() freigegeben voluntad

War aber bien, veces otra vez una wenig ASM a üben

SeeYou
Pascal
 
12.11.2010  
 



Respuesta


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

9.001 Views

Untitledvor 0 min.
Jens-Arne Reumschüssel06.01.2024
funkheld30.12.2021
RudiB.13.11.2021
p.specht27.05.2020
Más...

Themeninformationen

Dieses Thema ha 2 subscriber:

iF (5x)
Uwe ''Pascal'' Niemeier (4x)


Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie