1          PowerPC汇编

这里总结 PPC 指令集中几种常用的指令。
首先为运算和逻辑指令,它与通用寄存器有关,源数据来自 GPR 16 位立即数,目的是 GPR 寄存器,操作为 32 位, GPR 中存放 32 位更新数据 , 大多数都可以望文生义,注意在最后列的“ cntlzw ”指令“计算字中的第一个 0 ,在一个字中找到 1 时将一个指令中的 0 的数量找出,它在决定例外寄存器中最高优先服务时有用,我们将在例外处理那章讨论。
下面为装入存储指令,它们对数据在存储器中和通用寄存器中传送非常有用,如果数据小于一个字,为半个字或一个字节。指令总是使数据变位 32 位,将不同位填 0 或符号扩展。
lbz ”为“存 0 入字节”。
lha ”为“存半字”,意思为将符号扩展到一个字。
lhz ”为“存半字扩展”。
下一个为“ lwz ”指令,它为“存字扩展 0 它为 PPC 64 位结构中使用准备,但在 32 位结构中也可以使用。这个缩写不变。
还有“ store byte ”指令,“ store half word ”和 "store word"
下面我们看到 "load multiple word" , "store multiple word" , "load string word" "store string word"
另外,还有 2 个指令结尾位“ brx" - "sthbrx"  "stwbrx" PPC ENDIAN 格式数据非常有用,有可能是 PowerPC 与其他使用小 ENDIAN 格式数据的处理机共用存储器,为使 PowerPC 可以存取这样的数据,这些指令允许存取这样的数据。如果数据以小 ENDIAN 顺序进入总线,就把它存为大 ENDIAN 顺序。
下面介绍支持指令流控制的几个指令,它包括转移指令 . 这里我们看到转移指令,条件转移指令,它们利用条件寄存器的位来决定是否转移,在指令的右边说明了条件寄存器,它分为 4 4 位域,在每一域中的位代表小于、大于、等于和总和溢出,这个寄存器提供了 8 种支持条件转移指令的条件域。
同样还有转移到计数器的指令, SPR9 用在用户态编程模式中
特殊用途寄存器 8 可以完成基于接连寄存器的转移指令, SPR8 存储着转向子程序的地址。
还有自陷指令,一个系统调用指令,“ rfi ”用于例外服务程序,还有许多影响条件寄存器的指令。
下面,我们看到处理机控制指令的表,一个非常重要的因素是这些指令可以完成特殊用途寄存器之间和通用寄存器之间的数据交换,不可以直接对特殊用途寄存器中的值进行处理,但是,可以将一个值先拷贝到一个通用寄存器上再处理,操作后,将信息存到特殊用途寄存器上。
“特殊寄存器移出”指令将特殊寄存器中的数据移到通用寄存器上,“移入特殊寄存器”指令将通用寄存器上的数据移到特殊寄存器上。
举例说,如果用户要初始化计数寄存器,就要将数据装入通用寄存器,这里“装入立即数”指令装入 R13 和计数寄存器,然后,移入特殊寄存器指令将 R13 中的值装入计数寄存器。
比较指令可以影响任何条件寄存器域。
基本的比较指令语法为缩写 cmp 后面进跟着 4 个域。
第一域说明 CR0 CR7 中哪一個受影响,第 2 域指出长度,有 2 种长度选择, 32 位或 64 位, MPC860 中只有 32 位。第三和第四域指出將會比较的寄存器 rA rB
第二种比较的格式为“ cmpl ”比较逻辑,第三种为“ cmpi ”立即比较,第四种为“ cmpli 是立即比较逻辑;
比较功能也可以用简化的缩写完成,第一个例子是“ cmpw r13, r14 , 等于“ cmp cr0,0,r13,r14 ”,表中下面的例子说明可以在操作数中包括 cr5, 它是用来指定 cr5 而不是 cr0
在下面还有 2 个举例,有 2 个寄存器, r10 包括 16 进制的 7 千万, r11 包含 16 进制的 8 千万,第一个例子比较 r10 r11 并把值存入 cr5 中的条件位,在这里 cmpw 是一个符号比较,即 r11 r10 中的值有符号值。 16 进制, 7 千万是一个大正数, 16 进制 8 千万是一个负数,这样 r10 r11 大所以大于位设置,而“小于”位和“等于”位为 0
下一个指令相似但为逻辑,在这里,参数作为无符号数处理,这样, 16 进制 8 千万大于 16 进制 7 千万,所以 11 10 大,这样小于位设置,而“大于”位和“等于”位为 0
这里我们学习使用 XER 寄存器的多精度运算, XER 包含 3 个位:总和溢出、溢出和进位。
编程者需要指出使用或修改 XER 的那位,可以利用后缀的“ C ”“ E ”和 / 或“ O ”。“ C ”在 CA 中记录进位,“ E ”利用 CA 作为指令中的操作数在 CA 中记录进位。最后,“ O ”在溢出和总和溢出中记录溢出。
作为例子,一个简单的“ add ”指令不使用 XER ,“ addc ”在 CA 中记录进位,“ adde ”利用 CA 作为操作数并将进位记入 CA ,“ addo ”在 OV 中记录溢出,“ addco ”在 OV 中记录溢出 , CA 中记录进位。