关于内嵌汇编

//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……

阅读更多
换一批

没有更多推荐了,返回首页