请教一个powerpc汇编中的一个基本指令问题

发布于 2022-09-18 03:12:04 字数 1270 浏览 10 评论 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=

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ㄖ落Θ余辉 2022-09-25 03:12:04

你看的手册描述的只是一个结果,至于指令本身具体是如何实现的对你实际应用有影响吗?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。

吻风 2022-09-25 03:12:04

哈哈~ 可能是我比较多疑吧~ 不了解的话生怕会影响什么寄存器~ 或者有什么后果不能预测~

谢了~ 对于powerpc还要好好学习啊~

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文