06 2007 档案
摘要:计算栈的大小,是通过后端接口的代码来完成计算的。栈的大小,主要就是局部变量、临时变量、调用参数和返回值等使用的字节大小,如果变量可以放到寄存器,就不需加到栈的大小里。上面已经看了下面的代码:#044 case Blockbeg: #045 {#046 Symbol *p = cp->u.block.locals;#047 (*IR->blockbeg)(&cp->u.block.x);#048 for ( ; *p; p++)#049 if ((*p)->ref != 0.0)#050 (*IR->local)(*p);#051 else if (glev
阅读全文
摘要:从目标代码里,可以看到下面一行:#009sub esp, 16在这行里是保留栈的大小,值为16。但16个字节是怎么样计算出来的呢?下面就来分析LCC的代码,看它是怎么样计算的。它是在函数gencode里进行计算的,它的代码如下:#001void gencode(Symbol caller[], Symbol callee[]) #002{#003 Code cp;#004 Coordinate save;#005#006 if (prunetemps == -1)#007 prunetemps = !IR->wants_dag;#008 save = src;#009 if (assig
阅读全文
摘要:由于C语言可以动态地分配局部变量,因此它的运行环境都是基于栈式的分配来实现的,所以在函数的入口就会生成一段分配栈的代码,如下:#002[section .text]#003$main:#004push ebx#005push esi#006push edi#007 push ebp#008mov ebp, esp#009sub esp, 16第2行是NASM汇编的代码段开始。第3行是函数的名称,在NASM是一个过程标号。第4行是保存ebx寄存器。第5行是保存esi寄存器。第6行是保存edi寄存器。第7行是保存ebp寄存器,它是活动帧的指针。第8行是保存上一个栈指针。第9行是保留空间给局部变量和
阅读全文
摘要:当把所有的源程序生成DAG表示后,就进入了编译器的最后处理阶段,LCC是把DAG生成汇编的目标代码。在这一阶段,编译器为源程序定义和使用的变量选择存储单元,并把中间指令翻译成完成相同任务的汇编代码指令序列。在代码生成里,需要处理的问题是存储管理、指令选择、寄存器分配、计算次序等等。在第一节里就已经看到了汇编代码生成,函数的名称生成如下:#001[global $main]那么在LCC是怎么样生成上面的函数名称呢?现在就跟我来分析它的代码。先从函数里funcdefn里调用代码:#203if (cfunc->sclass != STATIC)#204 (*IR->export)(cfu
阅读全文
摘要:由于INDIR树与ADDRL树的类型相同,所以已经转换为ADDRL树,直接对ADDRL树进行进访问了,下面就是在函数listnodes里处理赋值表达式的ADDRL树,它的代码如下:#412case ADDRL: #413 { #414 assert(tlab == 0 && flab == 0);#415 if (tp->u.sym->generated)#416 addlocal(tp->u.sym);#417#418 p = node(tp->op + sizeop(voidptype->size), NULL, NULL, tp->u.
阅读全文
摘要:上一次说到赋值表达式转换为有向无环图的函数listnodes,下面继续来分析这个函数代码。当赋值树处理时,就运行下面的分支来处理:#256case ASGN:#257 { #258 assert(tlab == 0 && flab == 0);#259 if (tp->kids[0]->op == FIELD) #260 {#261 Treex = tp->kids[0]->kids[0];#262 Field f = tp->kids[0]->u.field;#263 assert(generic(x->op) == INDIR);#
阅读全文
摘要:前面已经介绍怎么样把赋值表达式变换到树的中间表示,接着下来编译器要做的事情就是怎么样把树变换成有向无环图。也许你会问为什么要把树变换成有向无环图,而不是直接生成最终代码呢?其实,学习过数据结构就很清楚有向无环图的应用,编译器里就是利用有向无环图的特性来进行局部代码优化的,最主要的优化就是删除公共表达式。下面就来分析LCC从树到有向无环图的实现代码。上面函数dcllocal里调用转换函数如下:walk(root(asgn(p, e)), 0, 0);从root函数里返回一棵赋值树,然后就把它传递给函数walk,在walk函数里就会调用一系列函数实现到DAG的转换。函数walk的代码如下:#001
阅读全文
摘要:前面分析了表达式的语法,也分析了语句的语法,但它们最终的目的就是生成合适的中间表示,在LCC里是采用树作为中间表示的。现在就来分析语句生成什么样的树表示,下面的语句是来自例子里,如下:int nTest1 = 1;这个语句是声明了一个局部变量nTest1,并且给nTest1赋值为1。LCC编译器要把它变换到分析树的表示,这样才利于后面的分析和使用。它的分析树如下: 左子树=右子树 赋值树:左子树-----ID树右子树-----常量表达式树由语法分析可知,赋值语句分析过程是先生成常量表达式树,然后生成ID树,最后生成赋值树,把它变换到DAG树,然后添加到代码表。在函数dcllocal里调用下面的
阅读全文
摘要:听说STLPORT的性能不错,心动不如行动,立即就上网下载STLPORT下来使用,先到下面的网址下载源程序:http://nchc.dl.sourceforge.net/sourceforge/stlport/STLport-5.1.3.zip这个压缩包不是很大,才1.6M,很轻松地就下载完成了。接着下来就是解压,比如我解压到目录:E:/software/LIB/STLport-5.1.3由于STLPORT包括IO库和容器库文件,如果只是想使用容器库文件,就不需要编译。如果IO库也想使用的话,就需要编译它才能使用。其实我很少使用它的IO库,就不必要编译了,只要把STLPORT目录包含到工程里,
阅读全文
摘要:在现代设计的程序里,很少再用到goto语句了。虽然使用goto语句是比较高效,但它使程序也会得非常难懂,非常难维护,比较容易出错,所以很少使用goto语句的。goto语句为无条件跳转语句,它的一般形式为:goto 标号;在LCC里的是用下面的代码来处理:#001case GOTO: #002 walk(NULL, 0, 0);#003 definept(NULL);#004 t = gettok();#005 if (t == ID) #006 {#007 Symbol p = lookup(token, stmtlabs);#008#009 if (p == NULL) #010 {#011
阅读全文
摘要:在实现中,程序其实就是处理数据,然后输出处理过的结果,在C语句里最直接的方式就是函数的返回值。比如求两个数据的最大值,就可以通过函数返回值来返回最大值。而函数的返回值是通过函数中的return语句获得的。return语句后面是一个表达式,需要调用表达式函数来处理。下面来分析LCC里的代码:#001case RETURN:#002 {#003 Type rty = freturn(cfunc->type);#004 t = gettok();#005 definept(NULL);第3行取得函数返回值的类型。第4行获取下一个记号。第5行定义了执行点。#006 if (t != ';
阅读全文
摘要:default语句是使用在switch语句的复合语句里,它是所有其它分支不能处理时的分支处理。在LCC里是如下处理的:#001case DEFAULT:#002 if (swp == NULL)#003 error("illegal default label/n");#004 else if (swp->deflab)#005 error("extra default label/n");#006 else #007 {#008 swp->deflab = findlabel(swp->lab);#009 definelab(swp-
阅读全文
摘要:case语句是使用在switch语句之中,它实现了选择一个分支执行。当表达式的值与case后面的常量表达式的值相等时,就执行此case语句后面的语句。LCC处理这个语句的代码如下:#001case CASE: #002 {#003 int lab = genlabel(1);#004 if (swp == NULL)#005 error("illegal case label/n");#006#007 definelab(lab);第3行生成标号1起始值。第4行是判断是否在switch语句中,如果不在就在第5行里提示出错。第7行是生成标号1。下面开始循环处理所有case语句
阅读全文
摘要:switch语句是多分支选择语句,主要方便多个选择的情况使用,当然也可以使用if语句来实现,但嵌套的if语句过多会使用程序的可读性降低。switch(表达式){case 常量表达式1: 语句1;case 常量表达式2: 语句2;…case 常量表达式n: 语句n;default: 语句n+1}上面就是switch的语法和语义,现在来分析LCC的源程序是怎么样处理这个语句的,先通过下面的函数代码调用:#054case SWITCH: #055 swstmt(loop, genlabel(2), lev + 1);#056 break;第55行是调用函数swstmt来处理switch语句。第一个参
阅读全文
摘要:continue语句的作用是跳过循环体中后面尚未执行的语句,接着进行下一次是否执行循环的判断。比如下面的例子:while(表达式1){ … if(表达式2)continue; …}下面就来仔细地分析LCC里处理continue语句的源程序:#001case CONTINUE: #002 walk(NULL, 0, 0);#003 definept(NULL);#004#005 if (loop)#006 branch(loop + 1);#007 else#008 error("illegal continue statement/n");#009#010 t = gett
阅读全文
摘要:Firefox 本地调试提示用户密码的解决方法我们用IIS + Firefox调试的时候总是提示用户名密码,用任何用户名密码都解决不了而解决方法其实很简单在firefox地址栏填about:config,进入配置页面找到 network.automatic-ntlm-auth.trusted-uris然后双击,填入localhost。 这样就OK了http://www.corange.cn/archives/2007/06/45.html
阅读全文
摘要:今天心情不好,想把一个很老的游戏下载下来玩一下,在baidu和google搜索中花费了半个小时,找到的“下载站点”是非常之多。但是一些网站根本就没有看到可以下载的链接。或者是广告位置就是下载。点击后也没有下载地址出来。还有一些到是比较醒目的下载地址,也可以访问,但是大多数是无法下载(FLASHGET)或者可以下载却是一个数百K到几M的rar或者exe文件。明显不是我要的游戏。之前有看到一些文章,这些垃圾站点就是靠这样的方法,全站或许都没有资源下载,但是因为baidu或者google中的排名好,活得那是相当的滋润。即使你今天不在这里下载,过几天你找其他东西,仍然链接到这里。唉,真是为了赚钱不择手
阅读全文
摘要:凹陷文字<div style="width:300px;padding:20px;overflow:hidden;word-wrap:break-word;word-break:break:all; font-size:12px; line-height:18px; background-color:#eeeeee;"><font disabled>怎么样,我凹下去了吧?<br>你不想试试吗?<br></font></div>================SELECT项目美化<style>
阅读全文
摘要:截图http://download1.csdn.net/down3/20070606/06132155974.jpg注册页面<link href="inc/reg_css.css" rel="stylesheet" type="text/css"><script src="Functions.js" language="JavaScript"></script><Br /><!--ajax--><table width="
阅读全文
摘要:<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%><!--#include file="Conndb.asp"--><%Sub DelSpilthFile(Table,tField,FilePath) '*********************************************** '过程名:DelSpilthFile '作 用:删除数据库里冗余的上传文件 '参 数:Table:数据表 ' tField:图片字段名
阅读全文
摘要:测试可以使用<iframe border=1 name="hj" id="hj" marginwidth=0 framespacing=0 marginheight=0 src="order_check/links.asp" frameborder=0 noResize width=100% scrolling=no vspale="0" bordercolor="#ffffff" ></iframe>link.asp<head><SCRIPT LANG
阅读全文
摘要:<SCRIPT language=JavaScript type=text/javascript>function GetObj(objName){if(document.getElementById){return eval('document.getElementById("' + objName + '")');}else{return eval('document.all.' + objName);}}function sltMenu(menuNo){//alert(menuNo);for(var i=1;
阅读全文
摘要:<SCRIPT language=javascript1.2>function showsubmenu(sid){whichEl = eval("submenu" + sid);if (whichEl.style.display == "none"){eval("submenu" + sid + ".style.display=/"/";");}else{eval("submenu" + sid + ".style.display=/"none
阅读全文
摘要:效果图片如上,代码很长。如下<!--#include file="inc/conn.asp"--><link href="inc/tanxiaofeng.css" rel="stylesheet" type="text/css"><%sqlSearch = "Select * From product"sqlSearch=sqlSearch & " order by updatetime desc"Set rsArticle = Serv
阅读全文
摘要:以前吧,遇到喜欢的电视可以看几天,不过这样的电视是比较少的,现在甚至连一部2小时的电影都没有心情看完。不是草草的看十分钟就认为不好看关了,就是不断的快进。另外一个之前很喜欢的游戏,最近发现也没什么兴趣了,也许是在等待仙剑4的关系吧。不过也许到时候也没兴趣去玩也不一定。
阅读全文
摘要:Visual Infinite Menus 各种下拉,侧拉菜单制作制作漂亮的CSS菜单利器Infinite Menus及其破解 分类:web技术前一阵子从网上看到了一个非常好的制作CSS菜单的工具:Infinite Menus。完全可视化界面,制作出来的菜单那叫精美……下载地址&效果预览:http://www.opencube.com/download.asp但软件是收费的,而且说得也不是很明白:制作和在本地调试期间是看不到收费的迹象的,但一旦发布到网上,每次撕开网页都会弹出个对话框“Infinite Menus must be purchased for Internet use.”相当令人
阅读全文