您好,欢迎来到爱问旅游网。
搜索
您的当前位置:首页PPC汇编培训资料

PPC汇编培训资料

来源:爱问旅游网
.

本文主要描述PPC的整数运算和跳转方面的指令,不涉及浮点数和系统指令如MMU、Cache、Exception等。

PPC的由来

1991年,IBM、Motorola、Apple联合定义了PowerPC 架构。 PowerPC的主要特点有: 采用RISC技术,同时引入少量复杂指令。这样降低计算机硬件设计复杂性,但对编译器和操作系统的要求更高;

应用并行指令(超标量)处理技术. 指令集和CPU硬件协调发展,编译器可以更好地调整指令, 发挥超标量处理的性能;

汇编指令集和编程语言结合得更好。

CISC是早先内存受限的条件下发展的, 因为复杂的指令带来代码的减少.但目前内存已经不是关键问题,解码复杂和执行时间长成了指令处理的瓶颈.

另外,IBM Berkely Stanford研究表明,如果指令集简单且大部分在一个周期内完成,运算性能会提高。因此采用RISC技术,可以降低指令复杂度,达到path length和cycle time number of cycles的平衡.

相关背景资料:

http://the.wall.riscom.net/books/proc/ppc/cwg/intro.html 详细介绍了PPC结构下编译器的指令调整技术。

PPC寄存器描述

为了方便指令流水线处理,PPC的汇编指令是等宽的,均为4字节,所以指令地址一定是4字节对齐的。

PPC的一个特点是定义了大量的通用寄存器,如用于整数运算和寻址的通用寄存器GPR0-GPR31(General-Purpose Registers)共32个。在ABI(Application Binary Interface)规范中,GPR1用于堆栈指针、GPR3-GPR4用于函数返回值、GPR3-GPR10用于函数参数传递。

用于浮点数运算的FPR0-FPR31(Floating-Point Registers)共32个,本文不做描述。

状态寄存器CR(Condition Register),用于反映运算结果、跳转判断条件等。分为如下8组:

每组4位,分别为LT(小于)、GT(大于)、EQ(等于)、SO(Summary overflow)。CR0默认反映整数运算结果、CR1默认反映浮点数运算结果。SO比较特殊,是XER寄存器SO位的拷贝。

对于比较指令,很容易理解LT、GT、EQ的含意;对于算术运算指令,结果为负数则为LT、正数GT、0为EQ。

部分内容来源于网络,有侵权请联系删除!

.

XER寄存器,反映运算过程的异常信息:

OV溢出;SO是溢出保存,一旦发生溢出OV置位后,SO也置位,除非指令清除之;CA进位。

Link Register 用于保存跳转指令的返回地址,也可以用于指定跳转的目标地址。 Counter Register 用于条件跳转时,进行减1判断非0或为0的条件,也可以用于指定跳转的目标地址。

PPC汇编语言说明

学习汇编可以提高一些调试效率,如在线修改代码:清除某一段代码、修改特定地址的常量、不执行某个函数、跳转到另一个函数等等。

学习汇编还可以深入理解编译器的实现,确认汇编实现和编程目的相同,对代码的正确性从另一个角度加以保证。

对于PPC的目编文件,可以用此命令:

D:\\Torandoppc20\\host\\x86-win32\\bin\\objdumpppc --debugging -D -l -t --show-raw-insn %1.o > %1.txt

得到包含反汇编后的文件。如: TestFunc3():

D:\\FP8270de-2005-0613-1621\\default/D:/FP8270/FPS/src/FpsFpProc/source/Test.c:18 00000010 a8 63 00 00 lha r3,0(r3) 00000014 4e 80 00 20 blr

这样方便研读由c语言生成的汇编程序。

PPC一般采用大尾字节序,所以与X86相反,约定bit0为MSB、bit31为LSB。 PPC汇编中,WORD为32位,HALF WORD 为16位,BYTE为8位。

此外为方便学习PPC汇编,这里提供了一个小程序,用于显示汇编指令码的各个字段。

内存加载和保存指令

通过寄存器+立即数方式间接寻址:

部分内容来源于网络,有侵权请联系删除!

.

相关Load Mem指令:lbz、lbzu、lha、lhau、lhz、lhzu、lwz、lwzu 指令格式:

lbz

指令名称 操作码 34 35 42 43 40 41 32 33 英文解释 Load Byte and Zero 中文解释 加载字节,目标寄存器的高三字节清零。 lbz lbzu lha lhau lhz lhzu lwz lwzu

Load Byte and Zero with 除了lbz的功能外,EA->rA,所以rA = 0Update 或者rA = rD时,该指令无效。 Load Half Algebraic Word 加载双字节,目标寄存器的高双字节由加载的双字节最高BIT填充,即符号扩展。 Load Half Word 除了lha功能外,EA->rA,所以rA = 0或Algebraic with Update 者rA = rD时,该指令无效。 Load Half Word and 加载双字节,高16位清零。 Zero Load Half Word and 除了lhz的功能外,EA->rA,所以rA = 0Zero with Update 或者rA = rD时,该指令无效。 Load Word and Zero 加载四字节。 Load Word and Zero 除了lwz功能外,EA->rA,所以rA = 0with Update 或者rA = rD时,该指令无效。 部分内容来源于网络,有侵权请联系删除!

.

相关Store Mem指令:stb、stbu、sth、sthu、stw、stwu 指令格式:

指令名称 操作码 38 39 44 45 36 37 英文解释 Store Byte Store Byte with Update Strore Half Word 中文解释 保存寄存器低8位到内存。 除了stb的功能外,EA->rA,所以rA = 0时,该指令无效。 保存寄存器低16位到内存。 stb stbu sth sthu stw stwu

Store Half Word with 除了sth的功能外,EA->rA,所以rA = 0Update 时,该指令无效。 Store Word Store Word with Update 保存寄存器到内存。 除了stw的功能外,EA->rA,所以rA = 0时,该指令无效。 寄存器+寄存器间接寻址:

相关Load Mem指令:lbzx、lbzux、lhax、lhaux、lhzx、lhzux、lwzx、lwzux

部分内容来源于网络,有侵权请联系删除!

.

指令名称 操作码 31 31 31 子操作码 87 119 279 英文解释 中文解释 lbzx lbzux lhzx lhzux lhax lhaux lwzx lwzux Load Byte and Zero 加载字节,目标寄存器的高三字节清零。 Indexed Load Byte and Zero 除了lbzx的功能外,EA->rA,所以rA = 0with Update Indexed 或者rA = rD时,该指令无效。 Load Half Word and 加载双字节,高16位清零。 Zero Indexed Load Half Word and 除了lhzx的功能外,EA->rA,所以rA = 0Zero with Update 或者rA = rD时,该指令无效。 Indexed Load Half Word 加载双字节,目标寄存器的高双字节由加Algebraic Indexed 载的双字节最高BIT填充,即符号扩展。 Load Half Word 除了lhax功能外,EA->rA,所以rA = 0Algebraic with 或者rA = rD时,该指令无效。 Update Indexed Load Word and Zero 加载四字节。 Load Word and Zero 除了lwz功能外,EA->rA,所以rA = 0with Update 或者rA = rD时,该指令无效。 31 311 31 343 31 375 31 31 23 55

相关Store Mem指令:stbx、stbux、sthx、sthux、stwx、stwux 指令格式:

指令名称 操作码 31 31 31 子操作码 215 247 407 英文解释 Store Byte Indexed 中文解释 保存寄存器低8位到内存。 stbx stbux sthx Store Byte with 除了stb的功能外,EA->rA,所以rA = 0Update Indexed 时,该指令无效。 Strore Half Word 保存寄存器低16位到内存。 Indexed 部分内容来源于网络,有侵权请联系删除!

.

sthux stwx stwux

31 31 31 439 151 183 Store Half Word 除了sth的功能外,EA->rA,所以rA = 0with Update Indexed 时,该指令无效。 Store Word Indexed 保存寄存器到内存。 Store Word with 除了stw的功能外,EA->rA,所以rA = 0Update Indexed 时,该指令无效。 算术运算指令:

寄存器与立即数间运算:

指令名称 操作码 14 12 13 15 08 07 英文解释 Add Immediate Add Immediate Carrying 中文解释 rA|0 与立即数相加,赋给rD。减立即数只要SIMM为负数即可。 rA 与立即数相加,赋给rD。减立即数只要SIMM为负数即可。还更新XER的CA位。 addi addic addic. addis subfic mulli Add Immediate Carrying 除addic功能外,还更新CR0的LT、GT、and Record EQ、SO位。 Add Immediate Shifted rA|0 + SIMM||0X0000 ->rD Sub From Immediate SIMM-rA 赋给rD,还更新XER的CA位。 Carrying Multiply Low Immediate 有符号乘法,rA * SIMM的低32位赋给rD。 部分内容来源于网络,有侵权请联系删除!

.

寄存器与寄存器间运算:

指令名称 add add. addo addo. subf subf. subfo subfo. addc addc. addco addco. subfc subfc. subfco subfco. adde adde. addeo addeo. subfe subfe. subfeo subfeo. mullw mullw. mullwo mullwo. mulhw mullhw. 操作码 子操作码 英文解释 中文解释 rA+rB->rD,如果Rc=1,还更新CR0(LT、GT、EQ、SO),如果OE=1,还更新XOR的SO、OV。 rB-rA->rD,如果Rc=1,还更新CR0(LT、GT、EQ、SO),如果OE=1,还更新XOR的SO、OV。 rA+rB->rD,更新XER的CA位,如果Rc=1,还更新CR0(LT、GT、EQ、SO),如果OE=1,还更新XOR的SO、OV。 rB-rA->rD,更新XER的CA位,如果Rc=1,还更新CR0(LT、GT、EQ、SO),如果OE=1,还更新XOR的SO、OV。 rA+rB+XER(CA)->rD,如果Rc=1,还更新CR0(LT、GT、EQ、SO),如果OE=1,还更新XOR的SO、OV。 rB + ~rA + XER(CA)->rD,如果Rc=1,还更新CR0(LT、GT、EQ、SO),如果OE=1,还更新XOR的SO、OV。 rA * rB 的低32位赋给rD,如果Rc=1,还更新CR0(LT、GT、EQ、SO),如果OE=1,还更新XOR的SO、OV。 rA * rB 的高32位赋给rD,如果Rc=1,还更新CR0(LT、GT、EQ、SO),OE固定为31 266 Add 31 40 Subtract From 31 10 Add Carrying 31 8 Subtract Carrying From 31 138 Add Extended 31 136 Subtract Extended from 31 235 Multiply Low Word 31 75 Multiply High Word 部分内容来源于网络,有侵权请联系删除!

.

0。 mulhwu 31 mullhwu. divw divw. divwo divwo. divwu divwu. divwuo divwuo.

11 无符号数乘法, rA * rB 的高32位赋给rD,Multiply High Word 如果Rc=1,还更新CR0(LT、GT、EQ、SO),Unsigned OE固定为0。 rA/rB->rD,如果Rc=1,还更新CR0(LT、GT、EQ、SO),如果OE=1,还更新XOR的SO、OV。 无符号数除法,rA/rB->rD,如果Rc=1,还更新CR0(LT、GT、EQ、SO),如果OE=1,还更新XOR的SO、OV。 31 491 Divde Word 31 459 Divde Unsigned Word

指令名称 addme addme. addmeo addmeo. 操作码 子操作码 英文解释 中文解释 31 234 rA+XER(CA)-1->rD,更新XER(CA),如Add to Minus One 果Rc=1,还更新CR0(LT、GT、EQ、SO),Extended 如果OE=1,还更新XOR的SO、OV。 ~rA+XER(CA)-1->rD,更新XER(CA),Subtract from Minus 如果Rc=1,还更新CR0(LT、GT、EQ、SO),One Extended 如果OE=1,还更新XOR的SO、OV。 rA+XER(CA)->rD,更新XER(CA),如果Rc=1,还更新CR0(LT、GT、EQ、SO),如果OE=1,还更新XOR的SO、OV。 subfme subfme. 31 subfmeo subfmeo. addze addze. addzeo addzeo. subfze subfze. subfzeo subfzeo. neg neg. 232 31 202 Add to Extended Zero 31 200 ~rA+XER(CA)->rD,更新XER(CA),如Subtrace from Zero 果Rc=1,还更新CR0(LT、GT、EQ、SO),Extended 如果OE=1,还更新XOR的SO、OV。 Negate -rA->rD,如果Rc=1,还更新CR0(LT、GT、EQ、SO),如果OE=1,还更新XOR的SO、31 104 部分内容来源于网络,有侵权请联系删除!

.

nego nego. OV。 比较指令:

寄存器与立即数比较:

指令名称 操作码 11 英文解释 Compare Immediate 中文解释 rA与有符号数SIMM比较,结果存入指定的CR寄存器中0-7组之一组。在32位应用下,L为1是无效指令。 rA与无符号数UIMM比较,结果存入指定的CR寄存器中0-7组之一组。在32位应用下,L为1是无效指令。 cmpi cmpli

10 Compare Immediate Logical 寄存器与寄存器比较:

指令名称 操作码 31 子操作码 0 英文解释 中文解释 rA与rB比较,结果存入指定的CR寄存器中0-7组之一组。在32位应用下,L为无关位。 rA与rB都作为无符号数比较,结果存入指定的CR寄存器中0-7组之一组。在32位应用下,L为1是无效指令。 cmp Compare cmpl

31 32 Compare Logical 部分内容来源于网络,有侵权请联系删除!

.

整数的逻辑运算指令:

寄存器与立即数运算:

指令名称 操作码 28 29 24 25 26 27 英文解释 And Immediate And Immediate Shifted OR Immediate OR Immediate Shifted XOR Immediate XOR Immediate Shifted 中文解释 rS & UIMM ->rA,更新CR0(LT、GT、EQ、SO)。 rS & (UIMM <<16) ->rA,更新CR0(LT、GT、EQ、SO)。 rS | UIMM ->rA rS | (UIMM <<16) ->rA rS ^UIMM ->rA rS^ (UIMM <<16) ->rA andi. andis. ori oris xori xoris

寄存器与寄存器的逻辑运算:

指令名称 and and. or or. xor xor. nand nand. nor 操作码 31 31 31 31 31 子操作码 28 444 316 476 124 英文解释 AND OR XOR NAND NOR 中文解释 rS & rB ->rA,如果Rc=1,还更新CR0(LT、GT、EQ、SO)。 rS | rB ->rA,如果Rc=1,还更新CR0(LT、GT、EQ、SO)。 rS ^ rB ->rA,如果Rc=1,还更新CR0(LT、GT、EQ、SO)。 ~(rS & rB)->rA,如果Rc=1,还更新CR0 (LT、GT、EQ、SO)。 ~(rS | rB) ->rA,如果Rc=1,还更新CR0(LT、部分内容来源于网络,有侵权请联系删除!

.

nor. eqv eqv. andc andc. orc orc. 31 284 Equivalent AND Complement OR Complement GT、EQ、SO)。 ~(rS ^ rB ->rA),相当于BIT位相等则为1,如果Rc=1,还更新CR0 (LT、GT、EQ、SO)。 with rS & (~rB) ->rA,如果Rc=1,还更新CR0(LT、GT、EQ、SO)。 with rS | (~rB) ->rA,如果Rc=1,还更新CR0(LT、GT、EQ、SO)。 31 31 60 412 单寄存器操作:

指令名称 extsb extsb. extsh extsh. cntlzw cntlzw. 操作码 31 31 子操作码 9 922 英文解释 Extend Sign Byte 中文解释 rS的低8位做符号扩展,赋给rA。 如果Rc=1,还更新CR0(LT、GT、EQ、SO)。 Extend Sign Half rS的低16位做符号扩展,赋给rA。 如果Word Rc=1,还更新CR0(LT、GT、EQ、SO)。 从rS的最高位开始,统计rS的连续为0的Count Leading BIT数,赋给rA。 如果Rc=1,还更新Zeros Word CR0(LT、GT、EQ、SO)。 31 26 整数循环移位和移位指令:

整数循环移位指令:

指令名称 rlwinm rlwinm. 操作码 21 英文解释 中文解释 Rotate Left Word rS循环左移SH位,再保留MB和ME之Immediate then And 间的位,其他位清零,把结果赋给rA。如部分内容来源于网络,有侵权请联系删除!

.

with Mask rlwimi rlwimi. 果Rc=1,还更新CR0(LT、GT、EQ、SO)。 20 rS循环左移SH位,再保留MB和ME之Rotate Left Word 间的位,其他位仍为rA的位,把结果赋给Immediate then Mask rA。如果Rc=1,还更新CR0(LT、GT、EQ、Insert SO)。 指令名称 rlwnm rlwnm.

操作码 英文解释 中文解释 rS循环左移rB(取rB的低5位)位,再保留Rotate Left Word then MB和ME之间的位,其他位清零,把结果And with Mask 赋给rA。如果Rc=1,还更新CR0(LT、GT、EQ、SO)。 23 整数移位指令:

指令名称 操作码 子操作码 英文解释 中文解释 rS左移rB(取rB的低5位,Bit27-Bit31)位, 右边空出的位清零,如果rB的Bit26为1,则rS全部移出,把移位结果赋给rA。如果Rc=1,还更新CR0(LT、GT、EQ、SO)。 rS右移rB(取rB的低5位,Bit27-Bit31)位, 左边空出的位清零,如果rB的Bit26为1,则rS全部移出,把移位结果赋给rA。如果Rc=1,还更新CR0(LT、GT、EQ、SO)。 slw slw. 31 24 Shift Left Word srw srw. 31 536 Shift Right Word sraw sraw.

31 792 有符号数rS右移rB位,如4右移1位为2,Shift Right -4右移1位为-2,负数能最多能移成-1。更Algebraic Word 新XER(CA)。如果Rc=1,还更新CR0(LT、GT、EQ、SO)。 部分内容来源于网络,有侵权请联系删除!

.

指令名称 操作码 子操作码 英文解释 Shift Algebraic Immediate 中文解释 有符号数rS右移SH位,如4右移1位为2,Right -4右移1位为-2,负数能最多能移成-1。更Word 新XER(CA)。如果Rc=1,还更新CR0(LT、GT、EQ、SO)。 srawi srawi.

31 824 跳转指令:

无条件跳转到指定地址:

指令名称 b ba bl bla

操作码 英文解释 中文解释 可以看出LI << 2最大为26位,看作有符号数,地址范围为-32M – (32M-1)。如果AA=1,目标地址为绝对地址LI<<2,如果AA=0,目标地址为相对地址CIA+(LI<<2)。 如果LK=1,还把CIA+4(返回地址)保存在LR中。 18 Branch 部分内容来源于网络,有侵权请联系删除!

.

条件跳转到指定地址:

指令名称 操作码 英文解释 中文解释 BD<<2最大16位,看作有符号数,地址范围为-32K – (32K-1)。BI(0-31)指定CR0-CR7的特定位,BO指定跳转条件是否判断BI位,如果判断BI位,跳转条件是BI位为TRUE还是FALSE; BO还指定跳转条件是否判断CTR减1值,如果判断,跳转条件是CTR减1后后为0还是非0。 当然也可以不指定跳转条件,即无条件跳转。 AA和LK的用法同b指令。不过可以看出,由于地址范围有限,绝对地址跳转基本上用处不大。 bc bca bcl bcla 16 Branch Conditional BO的含义编码:

部分内容来源于网络,有侵权请联系删除!

.

条件跳转到寄存器指定的地址:

指令名称 操作码 子操作码 英文解释 中文解释 bcctr bcctrl 19 528 跳转目标地址为CTR & (~3)。 BI(0-31)指定CR0-CR7的特定位,BO指定跳转条件是否判断BI位,如果判断BI位,跳转条件是BI位为TRUE还是FALSE; Branch Conditional 如果BO指定判断CTR减1值,则为无效to Count Register 指令。 当然也可以不指定跳转条件,即无条件跳转。 如果发生跳转且LK=1,还把CIA+4(返回地址)保存在LR中。 跳转目标地址为LR & (~3)。 BI(0-31)指定CR0-CR7的特定位,BO指定跳转条件是否判断BI位,如果判断BI位,跳转条件是BI位为TRUE还是FALSE; BO还指定跳转条件是否判断CTR减1值,Branch Conditional 如果判断,跳转条件是CTR减1后后为0to Link Register 还是非0。 当然也可以不指定跳转条件,即无条件跳转。 如果发生跳转且LK=1,还把CIA+4(返回地址)保存在LR中。 bclr bclrl 19 16 条件寄存器的逻辑操作:

部分内容来源于网络,有侵权请联系删除!

.

指令名称 操作码 19 19 19 19 19 19 子操作码 257 449 193 225 33 2 英文解释 中文解释 crand cror crxor crnand crnor creqv crandc crorc

Condition Register crbA指定的CR比特位 & crbB指定的比特AND 位 -> crbD指定的CR比特位。 Condition Register crbA指定的CR比特位 | crbB指定的比特OR 位 -> crbD指定的CR比特位。 Condition Register crbA指定的CR比特位 ^ crbB指定的比特XOR 位 -> crbD指定的CR比特位。 Condition Register ~(crbA指定的CR比特位 & crbB指定的比NAND 特位) -> crbD指定的CR比特位。 Condition Register ~(crbA指定的CR比特位 | crbB指定的比NOR 特位) -> crbD指定的CR比特位。 Condition Register ~(crbA指定的CR比特位 ^ crbB指定的比Equivalent 特位) -> crbD指定的CR比特位。即同或。 Condition Register crbA指定的CR比特位 & (~crbB指定的比AND with 特位) -> crbD指定的CR比特位。 Complement Condition Register crbA指定的CR比特位 | (~crbB指定的比OR with 特位) -> crbD指定的CR比特位。 Complement 19 129 19 417 指令名称 操作码 19 子操作码 0 英文解释 中文解释 mcrf

Move Condition crfS指定的CR寄存器8组之一copy到crfDRegister Field 指定的CR寄存器8组之一。 部分内容来源于网络,有侵权请联系删除!

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- awee.cn 版权所有 湘ICP备2023022495号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务