智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 15180|回复: 4
上一主题 下一主题

代码重定位的思考(2)----Literal Pool 

  [复制链接]

489

主题

1691

帖子

1

精华

管理员

网站创始人&站长

Rank: 11Rank: 11Rank: 11Rank: 11

积分
85681

特殊贡献奖章资源大师奖章论坛骨干奖章推广达人奖章优秀版主奖章热心会员奖章论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

QQ
威望
56815
贡献
17296
兑换币
13082
注册时间
2007-6-8
在线时间
5785 小时
跳转到指定楼层
1#
发表于 2009-9-18 17:02:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
作者: 快乐水牛
转自http://www.renesas-mcu.com/read.php?tid=43&fpage=2

根据(1)的测试,我们已经知道,编译器会把每个函数的入口地址以及常量的地址都放到一个称为Literal Pool(文字池)的区域。
请注意:Literal Pool里面只存放地址!
假设要操作一个常数,使用如下指令:
MOV.L H'FFFF0000,R0
编译器将这条指令编译成如下:
MOV.L @(H'0010:8,PC),R5
(H'0010:8,PC)就是H'FFFF0000在Literal Pool里面的地址,CPU根据这个地址,取出H'FFFF0000这个值,然后送入R5。
同理,调用函数时,如(1)里面经过编译后的代码:
MOV.L @(H'000C:8,PC),R7
JMP @R7
(H'000C:8,PC)就是被调函数的入口地址在Literal Pool里面的地址,CPU根据这个地址,在Literal Pool里取出被调函数的入口地址,然后去执行被调函数。

另外,一些指令被翻译成机器码之后,只占16或者32位。这样的话,操作数只有4位或者8位,无法直接处理32位的立即数。CPU借助Literal Pool,只需要在操作数里放置偏移量就可以使用一个32位的操作数。
SH2A的指令长度为16位。
试想一下,假设CPU的指令有64位或者更多,那么就可以直接使用一个32位的操作数了。实时上,在CISC体系的CPU中,例如Intel,指令长度可以达到15个Bytes,一条指令往往被编译成占用5个以上BYTE的机器码,一条指令就可以附带一个32位的操作数。但在RISC体系里,显然无法实现该功能。

总结:
我们现在可以回答(1)里面最后的疑问了。
程序在移动时,通常要把代码段和数据段一起移动。因为Literal Pool一般位于代码段的后面,当我们一起COPY这个Literal Pool的时候,程序会正确的找到被调函数的入口地址。见附录。
注意Literal Pool与代码的距离是有个范围的,如果PC的偏移量超过了这个范围,程序一样会跳转错误。这时,我们可以告知编译器,把Literal Pool放在这个范围内。SH2A的编译器一般都会自动完成这一功能(Automatic Literal Pool Gereration Function),或者用.POOL关键字来优化Literal Pool。一般的编译器都会有类似的功能。


附录:
Source program
-------------------------------------------  
.SECTION CD1, CODE, LOCATE=H'0000F000
CD1_START:
MOV.L #H'FFFF0000,R0
MOV.W #H'FF00,R1
MOV.L #CD1_START,R2
MOV   #H'FF,R3
RTS
MOV   R0,R10
.END
--------------------------------------------

Automatic literal pool generation result(source list)
-----------------------------------------------------
1  0000F000               1       .SECTION CD1, CODE, LOCATE=H'0000F000
2  0000F000               2     CD1_START
3  0000F000     D003  3       MOV.L #H'FFFF0000,R0
4  0000F002     9103  4       MOV.W #H'FF00,R1
5  0000F004     D203  5       MOV.L #CD1_START,R2
6  0000F006     E3FF  6       MOV   #H'FF,R3
7  0000F008     000B  7       RTS
8  0000F00A     6A03  8       MOV   R0,R10
9            **** begin pool ****
10 0000F00C     FF00             data for source-line 4
11 0000F00E     0000              alignment code
12 0000F010     FFFF0000      data for source-line 3
13 0000F014     0000F000      data for source-line 5
14           **** end pool   ****
15                              9       .END
-----------------------------------------------------

------摘自SH2A汇编器手册

0

主题

2

帖子

0

精华

注册会员

Rank: 2

积分
125
威望
173
贡献
22
兑换币
0
注册时间
2009-9-17
在线时间
0 小时
2#
发表于 2009-9-28 10:57:22 | 只看该作者
1# demon


写得很好
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
274
QQ
威望
248
贡献
22
兑换币
0
注册时间
2009-12-29
在线时间
2 小时
3#
发表于 2010-1-2 20:39:50 | 只看该作者
支持一下
回复 支持 反对

使用道具 举报

0

主题

0

帖子

0

精华

注册会员

Rank: 2

积分
123
威望
171
贡献
22
兑换币
0
注册时间
2010-5-2
在线时间
0 小时
4#
发表于 2010-6-27 18:36:00
路过,帮你顶顶




--------------------------------------------------------------------------------------------------------------------
传奇私服传奇私服传奇私服传奇私服传奇私服传奇私服传奇私服传奇私服
支持 反对

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|亿加合和智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-5-19 00:13 , Processed in 0.319981 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表