• 25
  • 11月

费了好大的劲,终于知道gp寄存器的用法了。

首先说说gp寄存器出现的原因吧,由于RISC体系的CPU,每条指令都是32Bit,而地址总线也是32Bit,这样,就不可能通过一条指令来实现Memory的访问。

MIPS中,访问Memory的指令格式为:

lw r1, offset(r2)

其中,offset为16Bit,也就是说,最多能访问以r2为基地址,前后32K的空间。

于是这个时候,gp就闪亮登场了。

我们知道,GCC在编译过程,会将变量分别放在data,bss,common等段。而编译mips程序时,会将小变量放入sdata,sbss,scommon等段。这个大小由编译选项-G来决定。-G0则表示不使用小数据段。默认是-G8,表示小于或等于8 byte的数据将放入小变量区。

这样的话,在上电时给gp初始化一个值,那么,所有小变量区的变量就可以通过

lw r1, offset(gp)

来访问了。

那么,GCC怎么知道gp初始化的值呢?只要在link文件中添加_gp符号,连接器就会认为这是gp的值。我们在上电时,将_gp的值赋给gp寄存器就行了。

» Tags:心得, MIPS

» 这篇文章共有5条评论,你可以在文章底部留下你的评论

  1. billyong Says:
    2010-05-08 16:15

    你很牛 谢谢 希望心的多多分享

  2. Randy Says:
    2011-12-07 22:11

    谢谢分享。
    请问:
    lw r1, offset(gp)这种方式决定了只能访问gp所在位置的前后各32K空间,那如果小数据区的大小超过64k怎么办呢?

  3. Hanny Says:
    2011-12-08 21:41

    @Randy
    既然是小数据区了,就尽量控制好大小吧。那些大的数组就不推荐放入小数据区了。

  4. Randy Says:
    2011-12-09 22:37

    谢谢
    所以Ld脚本会决定sbss, scommon, sdata占据区域总大小要小于64K,是不

  5. Lakesha Says:
    2013-09-03 22:40

    厉害!厉害!

发表评论