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

How do IBMs lis and ori instructions work?

我想知道 lisori 指令是如何工作的?有一个描述 IBM description 我不太理解。有人可以向我解释这个例子的结果是什么吗:

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

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 )

Extended Mnemonic lis rx, value => Equivalent to addis rx, 0, value. aka Load Immediate Shifted

addis 则定义为:

Calculates an address from a concatenated offset and a base address and loads the result in a general-purpose register.

本页 (http://www.ibm.com/developerworks/library/l-ppc/) 描述了 "Load Immediate Shifted" 操作:

Conveniently, lis (meaning "load immediate shifted") will load directly into the high 16 bits of the GPR. Then all that's left to do is add in the lower bits.

所以lis r1, 0x0028就是addis r1, 0, 0x0028,英文:Set the upper 16 bits of contents of register r1 to 0x0028。 (并将其他位归零,因为我们将 0x28 << 16 添加到 0。)

我认为ori的定义很简单:

Logically ORs the lower 16 bits of the contents of a general-purpose register with a 16-bit unsigned integer and stores the result in another general-purpose register.

在你的例子中,ori r1, r1, 0x776F:

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


因此这两条指令在寄存器 r1 中形成 0x0028776F,与之前的内容无关。

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

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