- 论坛徽章:
- 0
|
现在在看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= |
|