Delphi - Delphi + Ensamblador

 
Vista:

Delphi + Ensamblador

Publicado por Subzero (7 intervenciones) el 18/02/2003 06:26:19
Hola foristas

Donde puedo encontrar informacion de Delphi + Ensamblador, alguna pagina que se dedique a eso.

wsprintf API usa la convension C, cuando llamo a esta funcion desde Delphi, Yo debo limpiar la Pila, o Delphi lo hara por mi, porque lei que usa la convension "C"

Gracias foristas
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Delphi + Ensamblador

Publicado por Diego Romero (636 intervenciones) el 18/02/2003 12:14:54
He estado leyendo acerca de Assembler en Delphi en el boletín de LatiumSoftware
http://www.latiumsoftware.com/es/index.php
desde el número 36 al 42.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Delphi + Ensamblador

Publicado por Ernesto D'Spirito (706 intervenciones) el 18/02/2003 17:58:09
En el caso planteas, sí, efectivamente la API wsprintf usa la convención de llamadas Cdecl en vez de Stdcall como las demás funciones API. En la convención Cdecl, la pila la debe limpiar el llamador:

asm
push UltimoParametroOpcional
:
push SegundoParametroOpcional
push PrimerParametroOpcional
push PunteroACadenaDeFormato
push PunteroABufferDeSalida
call wsprintf
add esp, 20 // Limpiar la pila
end;

En lugar de 20, debes computar el tamaño de los parámetros que se empujaron en la pila. Nota que la unidad mínima de almacenamiento en la pila es de 4 bytes (por ejemplo un char ocupará 4 bytes en la pila).

Por si te interesa, he tratado las distintas convenciones típicas de llamadas en el Boletín Pascal #42:

http://www.latiumsoftware.com/es/pascal/0042.php#5

Espero que te sirva.

Ernesto D'Spirito
http://www.latiumsoftware.com/es/index.php
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Delphi + Ensamblador

Publicado por SubZero (7 intervenciones) el 18/02/2003 18:18:08
gracias Diego.

Ernesto:
Eso es en el caso de que Yo lo llame desde una linea en ensamblador, entonces yo mismo debo limpiar la pila.
Pero que sucede si llamo la funcion desde Delphi, sin usar las etiquetas de ensamblador.
Delphi limpiara la pila por mi, o yo debo de limpiarlo?

Mirare el link que me diste, gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Delphi + Ensamblador

Publicado por Ernesto D'Spirito (706 intervenciones) el 19/02/2003 21:26:34
Desde Delphi 1 hay un error conocido en la unidad Windows.pas, y es que la función wsprintf está declarada como stdcall en vez de cdecl.

De todos modos, aunque corrigieras eso para que el compilador automáticamente genere código para limpiar la pila tras la llamada (como sucede al llamar a cualquier función o procedimiento cdecl), en Delphi no tiene sentido llamar esa función porque Delphi no soporta las funciones con número variable de argumentos, así que tendrías que declarar muchas versiones de esa API, una para cada cantidad y tipo de parámetros que necesites pasarle... Creo que lo más práctico sería llamarla desde código en ensamblador como te indiqué, o en todo caso llamar a la función wvsprintf.

Ernesto D'Spirito
http://www.latiumsoftware.com/es/pascal/index.php
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar