IBM的lis和ori指令如何工作?

时间:2015-10-24 10:07:30

标签: assembly powerpc instruction-set

我想知道lisori说明如何运作?有一个我无法理解的描述IBM description。有人可以向我解释这个例子的结果是什么:

lis r1, 0x0028      
ori r1, r1, 0x776F  

1 个答案:

答案 0 :(得分:2)

此处定义了

lishttp://www-01.ibm.com/support/knowledgecenter/api/content/nl/en-us/ssw_aix_53/com.ibm.aix.aixassem/doc/alangref/fixed_point_load.htm#idx175

  

扩展助记符lis rx, value =>相当于addis rx, 0, value。又名立即加载

然后将

addis定义为:

  

从级联偏移量和基地址计算地址,并将结果加载到通用寄存器中。

本页描述了“加载立即转移”操作(http://www.ibm.com/developerworks/library/l-ppc/):

  

方便地,lis(意思是“加载立即移位”)将直接加载到GPR的高16位。然后剩下要做的就是添加低位。

所以lis r1, 0x0028addis r1, 0, 0x0028,英文:将寄存器r1的内容的高16位设置为0x0028。 (并将其他位置为零,因为我们将0x28 << 16添加到0。)

我认为ori的定义是直截了当的:

  

将通用寄存器内容的低16位逻辑或与16位无符号整数进行或运算,并将结果存储在另一个通用寄存器中。

在您的示例中,ori r1, r1, 0x776F

英文:获取寄存器r1中的任何内容的低16位,并使用0x776F(1110111 01101111)获取OR,然后将其存储回r1

因此,这两条指令在寄存器0x0028776F中形成r1,不依赖于先前的内容。

addis后低16位为零,因此对它们进行OR运算只需将它们设置为ori即时。

这样的2指令序列(设置高位的特殊指令,然后是addiori来设置低位)是用于构造任意32位常数的RISC ISA的典型代码;一个32位的指令字没有足够的空间用于整个32位立即。