#include <stdlib.h>
#include <stdio.h>

/* Program badający zawartość fragmentu stosu */

void showstack()
{
  int local = 0xDD111111;
  int *ptr = &local;
  int i;
  for(i = 18; i >= 0; i--)
    printf("%02d: [%08x] %08x\n", i, ptr+i, ptr[i]);

  /* Teraz rozbijamy main:local2 */
  ptr[12] = 0xDD222222;
}

int myfunction(int arg1, int arg2)
{
  int local1 = 0xFF111111;
  int local2 = 0xFF222222;
  int array[2] = {0xFFAA1111, 0xFFAA2222};
  showstack();
  return 0xFF333333;
}

int main(int argc, char *argv[], char **environ)
{
  int local1 = 0x11111111;
  int local2 = 0x22222222;
  int local3 = 0x33333333;

  /* Pobieramy argumenty */
  printf("main is at %08x, argc: %d, argv: %08x, env: %08x\n", 
	 &main, argc, argv, environ);
  printf("myfunction is at %08x\n", &myfunction);
  printf("showstack is at %08x\n", &showstack);
  
  /* Wywołanie z argumentami */
  local3 = myfunction(0xAA111111, 0xAA222222);

  /* Wznowienie w celu sprawdzenia, gdzie trafił wynik */
  local3 = myfunction(0xAA111111, 0xAA222222);
  exit(EXIT_SUCCESS);
}
