- 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寄存器就行了。
你很牛 谢谢 希望心的多多分享
谢谢分享。
请问:
lw r1, offset(gp)这种方式决定了只能访问gp所在位置的前后各32K空间,那如果小数据区的大小超过64k怎么办呢?
@Randy
既然是小数据区了,就尽量控制好大小吧。那些大的数组就不推荐放入小数据区了。
谢谢
所以Ld脚本会决定sbss, scommon, sdata占据区域总大小要小于64K,是不
厉害!厉害!