现在的位置: 首页 > 综合 > 正文

编译研究(3)——同名变量定义

2013年10月23日 ⁄ 综合 ⁄ 共 757字 ⁄ 字号 评论关闭
今天在处理变量时发现了一个问题:对于不同函数中定义的同名变量,在源代码中,我原来只是简单根据变量名称进行区分,由于作用范围不同,所在符号表不同,因为虽然同名但互不影响;但这样的方法用在中间代码中就会出问题。例如中间代码使用同一个列表处理所有变量,并只是简单根据变量名称来在这个列表中索引变量的值,因此同名变量会重叠,并相互影响。
为此参考了vc生成的汇编代码,发现它对变量的引用都是把变量名称和基址指针联合起来表识一个变量,例如有以下c/++代码:

int n=1 ;

则它的汇编代码会是这样的:

_TEXT SEGMENT
_n$ 
= -4
mov DWORD PTR _n$[ebp], 
1

可见它是利用变量名称和基址指针指向的实时值联合起来引用一个变量,如此一来就能够很好解决变量名称重叠的问题。
鉴于我的虚拟机种内存模型还很简单,不能用这么复杂的寄存器来表示变量,因此我暂时根据变量所在函数的序号和变量名称来引用变量:

n=1 ;

则中间代码是:

mv  n?1,   1

表示这里引用的是1号函数中定义的n。 
另外,如果考虑在不同嵌套层次定义同名变量,方法也类似。如下代码所示:

$不同嵌套作用域的同名变量定义

_proc test() :

    int n
=0 ;

    
if(n==
0)
        int n
=1
 ;
        loop(
1
)
            int n 
= 21
 ;
        endl
        n 
= n+1
 ;
    endi
    n 
= 1
 ;

_endp
在生成代码时,只要根据作用域来加以区分即可。例如函数序号为0,函数入口处作用域编号为0,第一个嵌套作用域编号加1,依次递增。上述代码中,第一个n在中间代码中表示为 n?0?0 ,第二个为n?0?1 ,第三个为n?0?2 等等,如此类推。

抱歉!评论已关闭.