请教一个powerpc汇编中的一个基本指令问题
现在在看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=
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
你看的手册描述的只是一个结果,至于指令本身具体是如何实现的对你实际应用有影响吗?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。
哈哈~ 可能是我比较多疑吧~ 不了解的话生怕会影响什么寄存器~ 或者有什么后果不能预测~
谢了~ 对于powerpc还要好好学习啊~