//3.22:最近才发现原来NOI不给用内嵌汇编……那么这篇文章除了平常做做OJ以外就没什么意义了……
参考自:http://blog.csdn.net/gy_jk/article/details/5667182
嗯……搞OI久了应该都会碰到这么一种问题
爆栈……
当然,手写栈是最普遍的一种解决方法
比如NOI2011 day2 T1,MS是临时换的一道水题,只要会手写栈就可以水过
Pascal党是很舒服的,因为可以在代码中手动把栈开大
但是c/c++党不行……因为MS栈的大小是在链接时决定的……
如果是自己测的话,可以设置gcc/g++的参数,加入-Wl,--stack=xxxx
来手动修改链接时决定的栈大小
//xxxx为栈空间大小,我一般设为一般为1后面若干0……反正是自己测……
但是这种方法在OJ或者考试的时候行不通
//因为这种方法要改编译时的参数//废话……
而又不想手写栈的同学可以考虑下面一种方法……私以为比手写栈要方便
虽然其实手写栈也挺好写的……
嗯……下面进入正题
int stack[stack_size],bak; void Callxxx() { __asm__ __volatile__ ( "mov %%esp,%0\n" "mov %1,%%esp\n" :"=g"(bak) :"g"(stack+stack_size-1) : ); xxx(); __asm__ __volatile__ ( "mov %0,%%esp\n" : :"g"(bak) : ); }这一段是核心代码
嗯……就是写这样一个CallFuction过程出来,然后Fuction函数在里面照调
如果需要多次调用某个函数,而且参数都不同,可以把CallFuction写成有参数的
如果需要多次调用不同的函数,而且凑巧这两个函数参数列表一样,还可以多传一个函数指针,这样Call的过程就只用写一个
它实际上是将指向栈的指针重定向到了一个数组上
而且这段代码是万金油
不管是调怎样的函数,参数有多少个,汇编的部分都是这样写
如果要知道内嵌汇编详细的方式
可以参考http://www.ibm.com/developerworks/cn/linux/l-assembly/
唯一的缺点是消耗的空间会比较大……
POI2008 sta这道题
100w个点的DFS……我硬是开了2kw的数组才能过
要不然就会re……