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

AR9*_*R93 3 assembly powerpc instruction-set

我想知道如何操作lisori说明如何工作?有一个描述IBM 的描述,我不太明白。有人可以向我解释这个例子的结果是什么:

lis r1, 0x0028      
ori r1, r1, 0x776F  
Run Code Online (Sandbox Code Playgroud)

Dai*_*Dai 5

lis在这里定义(http://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,在英语:寄存器内容的高16位设置r1到0×0028。(并将其他位归零,因为我们添加0x28 << 160.)

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

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

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

In English: 获取寄存器中任何内容的低 16 位r1并将它们与 0x776F ( 1110111 01101111)或,然后将其存储回r1.


所以这两条指令0x0028776F在 register 中形成r1,不依赖于之前的内容。

后的低 16 位为零addis,因此对它们进行 OR 运算只是将它们设置为ori's 立即数。

像这样的两个指令序列(特殊指令设置高位,则addiori以设置低比特)是用于构建任意的32位常数典型RISC的ISA的; 32 位指令字没有空间容纳整个 32 位立即数。

  • 这不依赖于 r1 的原始内容;因为`addis`的第二个操作数为零,我们只需将`r1`设置为`(value &lt;&lt; 16) + 0` (2认同)