Autor Tema: Duda con stack  (Leído 1796 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Duda con stack
« en: 11 de Junio de 2010, 21:30:38 »
Hola amigos, existe la forma de dirigirse a un subrutina (Void) pero sin cargar el stack, igual como se hace en assembler con el goto, poder borrar el stack, o realizar un goto fuera de la subrutina donde se aplica la instrucción ?

gracias.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Duda con stack
« Respuesta #1 en: 11 de Junio de 2010, 23:15:27 »
Llamar a una funcion siempre involucra el stack, donde por lo menos se almacena la dirección de retorno. En algunos compiladores nuevos existe la palabra reservada _inline_ o algo similar donde el compilador en vez de llamar a la función coloca el código de la misma sin utilizar el stack. Para realizar un goto a lugar fuera del scope de una función el ANSI C define dos funciones que permiten hacer esto y son:

  • setjmp
  • logjmp

Pero tienen que estar soportados por el compilador.


Saludos !

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Duda con stack
« Respuesta #2 en: 12 de Junio de 2010, 10:19:54 »
Hola Richi, gracias por responderme, créeme que he estado consultando en la web harto rato acerca de estas 2 funciones (setjmp, logjmp), pero la verdad no logro comprender su funcionamiento, si te queda fácil te ruego me aclares un poco más como funcionan.

gracias.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Duda con stack
« Respuesta #3 en: 12 de Junio de 2010, 14:44:32 »
Hola estas dos funciones deben ser implementadas en assembler por eso no todos los compiladores la soportan. Basicamente este par de funciones son usadas para un GOTO no Local. Lo que hace setjmp es almacenar el contexto de la CPU ( Registros ) en la estructura que recibe en ese momento. La otra funcion longjmp lo que hace es saltar a la posición previamente almacenada, que es lo mismo que hacer un GOTO. Su uso principal es la de implementar execpciones, donde ante un error la secuencia de ejecucuión es salteada directamente y capturada por el llamador o catch.

http://en.wikipedia.org/wiki/Setjmp.h

Código: C
  1. #include <stdio.h>
  2. #include <setjmp.h>
  3.  
  4. static jmp_buf buf;
  5.  
  6. void second(void) {
  7.     printf("second\n");         // prints
  8.     longjmp(buf,1);             // jumps back to where setjmp was called - making setjmp now return 1
  9. }
  10.  
  11. void first(void) {
  12.     second();
  13.     printf("first\n");          // does not print
  14. }
  15.  
  16. int main() {  
  17.     if ( ! setjmp(buf) ) {
  18.         first();                // when executed, setjmp returns 0
  19.     } else {                    // when longjmp jumps back, setjmp returns 1
  20.         printf("main");         // prints
  21.     }
  22.  
  23.     return 0;
  24. }

Saludos !

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Duda con stack
« Respuesta #4 en: 12 de Junio de 2010, 20:47:12 »
Richi, muchas gracias por la información

saludos.


 

anything