• Miércoles 20 de Noviembre de 2024, 12:22

Autor Tema: [Artículo] Devolver Valores (ASM)  (Leído 8147 veces)

-SB-

  • Miembro activo
  • **
  • Mensajes: 60
    • Ver Perfil
[Artículo] ..y cuando termina la ejecucion de la funcion?
« en: Sábado 3 de Julio de 2004, 05:41 »
0
Cuando tenemos un return en una funcion, la ejecucion no sigue, en el caso que has expuesto tu,
int mi_funcion()
{
//__asm mov eax,76
return 76;
}
una linea es similar a la otra porque no esta dentro de un ciclo por ejemplo, porque al hacer un return en un ciclo, la funcion termina, y si solo movemos al registro eax el valor, la funcion sigue corriendo..
void sin_valor()
{
return1(66);
return2(75);
return3(99);
}
Devolvemos tres valores, pero cuando termina la funcion si se devuelven dentro de un bucle?
Se te ocurre alguna solucion para esto?

Lo demas esta muy bien,

Un saludo!

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re:..y cuando termina la ejecucion de la funcion?
« Respuesta #1 en: Sábado 3 de Julio de 2004, 13:52 »
0
No se entiende muy bien lo que dijiste pero voy a tratar de responderte.
[code]
int devolucion()
{
   __asm
   {
     return1(50);
     return2(60);
     return3(70);
   }
   return;
}
[code]

Ese código es válido en VC++ y te permite devolver tres valores y terminar la función con el mismo return pero sin ningún valor evitando que cambie el valor de eax. Por lo tanto lo podes ubicar en un switch, dentro de un while, un for o donde quieras.

Por cierto, cuando la función llega a su última linea termina, no importa que no haya un return.

Saludos,
Mariano.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Devolver Valores (ASM)
« Respuesta #2 en: Jueves 23 de Noviembre de 2006, 21:58 »
0
¿Alguna vez se preguntaron que hace la instruccion return de CC++ y porque estamos limitados a devolver un solo valor cuando podemos pasarle varios a una funcion?

¿Que es lo que hace la instruccion return? Algo muy simple que es ajustar la pila segun la llamada, darle un valor a eax y saltar a la instruccion siguiente a la que llamo a nuestra funcion.

Código: ASM
  1. Lo que nos interesa es esto
  2. __asm
  3. {
  4. mov eax,valor
  5. }


En Windows el valor que devuelve una funcion se guarda en el registro eax; pero eax no es el unico registro que existe ni mucho menos, existen 4 registros de uso general (eax,ebx,ecx y edx).

eax viene de acumulador, ebx de base (no lo podemos usar para devolver nada porque Windows lo maneja), ecx de contador y edx de dato. Entonces tenemos 2 lugares mas donde devolver valores de una funcion, como si tuvieras un return1, return2 y un return3!!.

Vamos a ver un ejemplo muy simple para empezar:


Código: ASM
  1. #include <windows.h>
  2. void SayLong(int number)
  3. {
  4.   char Data[5];
  5.   ltoa(number,Data,10);
  6.   MessageBox(0,Data,"El Numero",0);
  7. }
  8.  
  9. int mi_funcion()
  10. {
  11.   //__asm mov eax,76
  12.   return 76;
  13. }
  14.  
  15. void main()
  16. {
  17.   DWORD Resultado = 0;
  18.   Resultado = mi_funcion();
  19.   SayLong(Resultado);
  20. }
  21.  



Que hace este programa?
Algo muy simple muestra con un MessageBox el valor que devuelve la funcion mi_funcion, pero esto nos va a servir para demostrar lo que les conte antes; descomenten la linea que comienza con __asm (le dice al compilador que escriba una o varias instrucciones de ensamblador) y comenten la que empieza con return.

Que funciona exactamente igual? Si, si, Windows devuelve el valor de una funcion en eax.

Ahora vamos a lo bueno, si no existe solo eax y tambien tenemos 2 registros como ecx y edx eso significa que podemos devolver hasta 3 valores de una funcion!

Código: ASM
  1. #include <windows.h>
  2.  
  3. void SayLong(int number)
  4. {
  5.   char Data[5];
  6.   ltoa(number,Data,10);
  7.   MessageBox(0,Data,"El Numero",0);
  8. }
  9.  
  10. void return1(DWORD Valor) { __asm mov eax,Valor }
  11. void return2(DWORD Valor) { __asm mov ecx,Valor }
  12. void return3(DWORD Valor) { __asm mov edx,Valor }
  13.  
  14. void sin_valor();
  15.  
  16. void main()
  17. {
  18.   DWORD Valor1,Valor2,Valor3;
  19.   sin_valor();
  20.   __asm mov Valor1,eax
  21.   __asm mov Valor2,ecx
  22.   __asm mov Valor3,edx
  23.   SayLong(Valor1);
  24.   SayLong(Valor2);
  25.   SayLong(Valor3);
  26. }
  27.  
  28. void sin_valor()
  29. {
  30.   return1(66);
  31.   return2(75);
  32.   return3(99);
  33. }


Finalmente ahora viene lo bueno, creamos un array de punteros (tipo string) en una funcion y la utilizamos en otra:

Código: ASM
  1. #include <windows.h>
  2.  
  3. void SayLong(int number)
  4. {
  5.   char Data[5];
  6.   ltoa(number,Data,10);
  7.   MessageBox(0,Data,"El Numero",0);
  8. }
  9.  
  10. void return1(DWORD Valor) { __asm mov eax,Valor }
  11.  
  12. DWORD Trozear(char *str)
  13. {
  14.   DWORD Max = strlen(str);
  15.   DWORD Palabras = 0;
  16.   char **str_array = (char**)malloc(1*4); //un solo puntero a string
  17.   str_array[0] = (char*)malloc(1024);
  18.   ZeroMemory(str_array[0],1024);
  19.  
  20.   for (int x = 0;x < Max;x++)
  21.   {
  22.     DWORD Pos = strlen(str_array[Palabras]);
  23.     if (str[x] == 32)
  24.     {
  25.       Palabras++;
  26.       str_array = (char**)realloc(str_array,(Palabras+1)*4);
  27.       str_array[Palabras] = (char*)malloc(1024);
  28.       ZeroMemory(str_array[Palabras],1024);
  29.     }
  30.     str_array[Palabras][Pos] = str[x];
  31.     str_array[Palabras][Pos+1] = 0;
  32.   }
  33.   __asm
  34.   {
  35.     mov ecx,[str_array]
  36.   }
  37.   return Palabras+1;
  38. }
  39.  
  40. void main()
  41. {
  42.   DWORD Palabras = 0;
  43.   char *texto = (char*)malloc(1024);
  44.   strcpy(texto,"Esta es una prueba para que separe por espacios");
  45.   Trozear(texto);
  46.   char **str_ptr;
  47.   __asm mov Palabras,eax
  48.   __asm mov [str_ptr],ecx
  49.   SayLong(Palabras);
  50.   for (int y = 0;y < Palabras;y++)
  51.   {
  52.     MessageBox(0,str_ptr[y],"Palabra",0);
  53.     free(str_ptr[y]);
  54.   }
  55.   free(str_ptr);
  56.   free(texto);
  57. }
  58.  
  59.  

Bueno, espero que les haya gustado, se que ya habra algunos diciendome que podria haber usado un doble puntero en el
prototipo de la funcion y obtener el mismo resultado; si, pero sin saber como funciona.
Por cierto en mi trabajo utilize este metodo para devolverme otros valores de una DLL creada por una compañera, asi seguia siendo compatible (en cuanto a parametros).

Saludos,
Mariano.

Autor: Mariano Ventaja

http://www.c0d3rz.com.ar

Descarga: http://www.c0d3rz.com.ar/foro/viewtopic.php?t=53

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
punteros vs return
« Respuesta #3 en: Lunes 27 de Noviembre de 2006, 02:37 »
0
que ventaja tiene al uso de punteros?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
¿Ventajas?
« Respuesta #4 en: Martes 28 de Noviembre de 2006, 18:47 »
0
Ninguna, es un articulo informativo, no propone hacer esto en el desarrollo normal.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

fallenanngel

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
... ayuda con el puerto paralelo...
« Respuesta #5 en: Sábado 2 de Diciembre de 2006, 17:35 »
0
Hola..

xfavor necesito que alguien me ayude, tengo un problema, necesito hacer un programa que me reciba datos por el puerto paralelo esto mediante un circuito...xfavor cualkier ayuda la aceptaria con gusto..