#include <stdio.h>

int main(void) {
	void* a;
	void* b;
	void* c;
	a=b=c=NULL;
	__asm__ volatile (
		"mov %%esp,%%eax\n\t"
		"push %%eax\n\t"
		"mov %%esp,%%ebx\n\t"
		"pop %%eax\n\t"
		"mov %%esp,%%ecx\n\t"
		"mov %%eax,%0\n\t"
		"mov %%ebx,%1\n\t"
		"mov %%ecx,%2\n\t"
	: "=m"(a),"=m"(b),"=m"(c)
	::"%eax","%ebx","%ecx");
	printf("%p\n%p\n%p\n",a,b,c);
	putchar('\n');
	a=b=c=NULL;
	__asm__ volatile (
		"mov %%esp,%0\n\t"
		"push %%eax\n\t"
		"mov %%esp,%1\n\t"
		"pop %%eax\n\t"
		"mov %%esp,%2\n\t"
	: "=m"(a),"=m"(b),"=m"(c)
	::);
	printf("%p\n%p\n%p\n",a,b,c);
	putchar('\n');
	a=b=NULL;
	__asm__ volatile (
		"mov %%esp,%0\n\t"
		"push %%eax\n\t"
		"lea %1,%%ebx\n\t"
		"pop %%eax\n\t"
		"mov %%ebx,%0\n\t"
	: "=m"(a),"=m"(b)
	::"%ebx");
	printf("%p\n%p\n",a,&b);
	return 0;
}
