免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4781 | 回复: 2
打印 上一主题 下一主题

请教一个powerpc汇编中的一个基本指令问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-11 15:26 |只看该作者 |倒序浏览
现在在看powerpc的ppcboot启动代码~

8241的CPU,内核是603E~

在603e中,通用寄存器都是32位的,而每条指令为定长的32位~

ppcboot中对于bat的赋值代码如下

lis        r4, CFG_IBAT0L@h
ori        r4, r4, CFG_IBAT0L@l

使用两条指令来完成一个对32位寄存器的赋值,因为每条指令只能操作16位的立即数,所以32位的立即数需要2条指令~

现在疑问就在lis指令上,lis指令为addis指令的特殊形式,为 addis Rx,0,value~

对于lis的addis指令 , Book E1的描述如下,在Version 2.02的61页

OPCD  RT  RA    SI
  15     Rx   0   value

RT <- EXTS(SI || (16)0)    这个16在0的左上角~ 表示16个0~

对于lis指令 , Book E1的描述如下,在Version 2.02的172页

Load a 16-bit signed immediate value, shifted left by 16 bits, into register Rx.
lis Rx,value (equivalent to: addis Rx,0,value)

问题:
1.按照文档描述,使用lis指令则会将value左移16位之后保存进Rx,呢么是什么时候进行左移的?~ 在addis的描述中没有左移的描述,所以我现在猜测为value是左移16位,高低16位互换之后才执行addis操作,也就是说lis指令分成了两个部分,第一部分左移value,第二部分执行addis

2.保存进Rx,是保存到Rx的高16位还是保存到Rx的低16位?~ 按照语句的含义应该是保存进Rx的高16位,但是手册中对于addis和lis都没有这样的描述,在网上搜索了一下,好像是与@h这个语句有关,按我的理解,@h不应该是汇编语句的一部分,最大胆的猜测是这是一个宏一样的语句,作用是将Rx的高低16位互换,或者指明Rx高16位

不知道我的理解对不对~ 请大家指教一下~  = 3=

论坛徽章:
0
2 [报告]
发表于 2009-09-13 14:41 |只看该作者
你看的手册描述的只是一个结果,至于指令本身具体是如何实现的对你实际应用有影响吗?lis只是addis的特殊形式,add rD,rA,SIMM的描述如下:
if rA = 0 then rD ← EXTS(SIMM || (16)0)
else    rD ← (rA) + EXTS(SIMM || (16)0)

lis中rA是0,所以就好比rD = (SIMM << 16) | 0xffff0000,至于移位是循环移位还是把高位丢掉,是CPU内部实现的问题,我们不用去关心,只要知道结果是什么就行了。

XXX@h和XXX@l是汇编器支持的,用于表示符号所代表的地址的高16bit还是低16bit。

论坛徽章:
0
3 [报告]
发表于 2009-09-13 20:25 |只看该作者
哈哈~ 可能是我比较多疑吧~ 不了解的话生怕会影响什么寄存器~ 或者有什么后果不能预测~

谢了~ 对于powerpc还要好好学习啊~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP