PowerPC总汇编指令集

合集下载

汇编语言常用指令汇总持续更新

汇编语言常用指令汇总持续更新

汇编语言常用指令汇总持续更新汇编语言常用指令汇总汇编语言是一种低级编程语言,用于与计算机硬件进行直接交互。

熟悉汇编语言的常用指令对于理解计算机底层原理和进行底层编程非常重要。

本文将对汇编语言常用指令进行汇总,并持续更新。

1. 数据传输指令:- MOV:用于将数据从一个位置复制到另一个位置。

- LXI:用于将双字节立即数加载到指定的寄存器对中。

- LDA:用于将累加器加载到内存地址中的数据。

- STA:用于将累加器中的数据存储到指定的内存地址中。

2. 算术运算指令:- ADD:用于将累加器的内容与给定的寄存器或内存位置中的数据相加。

- SUB:用于从累加器中减去给定的寄存器或内存位置中的数据。

- INR:用于将给定的寄存器或内存位置中的数据增加1。

- DCR:用于将给定的寄存器或内存位置中的数据减少1。

3. 逻辑运算指令:- AND:用于将累加器的内容与给定的寄存器或内存位置中的数据进行逻辑与操作。

- OR:用于将累加器的内容与给定的寄存器或内存位置中的数据进行逻辑或操作。

- XOR:用于将累加器的内容与给定的寄存器或内存位置中的数据进行逻辑异或操作。

- NOT:用于对累加器的内容进行逻辑非操作。

4. 控制指令:- JMP:用于无条件转移到指定的内存地址。

- JZ:在累加器为零时,转移到指定的内存地址。

- JC:在进位标志为1时,转移到指定的内存地址。

- CALL:用于调用子程序。

5. 栈操作指令:- PUSH:用于将给定的寄存器或数据压入栈中。

- POP:从栈中弹出数据并存储到给定的寄存器中。

6. 输入输出指令:- IN:从外部设备读取数据,并存储到累加器中。

- OUT:将累加器中的数据发送到外部设备。

以上仅是汇编语言中常用指令的一小部分,还有许多其他指令可用于执行更复杂的任务。

在实际的汇编语言程序中,这些指令通常会与标签、变量和宏指令一起使用。

总结:汇编语言常用指令汇总了数据传输、算术运算、逻辑运算、控制、栈操作和输入输出等方面的指令。

[计算机]PPC汇编入门指南

[计算机]PPC汇编入门指南

看懂PowerPC汇编,需要如下3方面的知识:1.PowerPC指令集架构即Power ISA,可以从获得,包括寄存器定义,数据模型,寻址方式和指令定义以及指令助记符;2.PowerPC ABI即应用程序二进制接口,即寄存器的使用规范和栈调用结构;3.PowerPC Pseudo-ops,即.text, .align n等汇编语言中常用的伪操作符。

PowerPC ISA分为3个级别即“Book”,分别对应于用户指令集体系结构,虚拟环境体系结构和操作环境体系结构。

其中Book III分化出了服务器版本Book III-S(经典PowerPC架构)和嵌入式版本Book III-E(专门为嵌入式优化的版本)。

1.寄存器定义:PowerPC处理器寄存器分为2大类-专用寄存器和非专用寄存器。

其中,非专用寄存器包括32个通用目的寄存器(GPR),32个浮点寄存器(FPR),条件寄存器(C R),浮点状态和控制寄存器(FPSCR);专用寄存器主要包括连接寄存器(LR),计数寄存器(CTR),机器状态寄存器(MSR)以及时间基准寄存器(TBL/TBU)等等。

PPC4xx系列处理器还有DCR寄存器,需要用专门的指令访问。

这里有两点需要注意:1. PowerPC处理器可以运行于两个级别,即用户模式和特权模式。

用户模式下,仅有GPR,FPR,C R,FPSC R,LR,CTR,XER以及TBL/TBU可以访问。

从Power ISA2.05开始,DCR寄存器也可以在通过用户模式DC R访问指令进行访问。

2.PowerPC处理器没有专用的栈指针寄存器和PC指针寄存器,也就是说硬件不负责维护调用栈。

2.数据模型:PowerPC支持如下数据格式:byte, halfword, word, doubleword,quadword, 同时默认支持big-endian 字节序,即MSB(最高有效字节,例如0x12345678中0x12即MSB)保存在低地址。

32位PowerPC常用指令集总结

32位PowerPC常用指令集总结

32位PowerPC常用指令集总结第一部分PowerPC 精简指令集计算机(RISC)简介PowerPC 体系结构是一种精减指令集计算机(Reduced Instruction Set Computer,RISC)体系结构,定义了200 多条指令。

PowerPC 之所以是RISC,原因在于大部分指令在一个单一的周期内执行,而且通常只执行一个单一的操作(比如将内存加载到寄存器,或者将寄存器数据存储到内存)。

PowerPC 体系结构分为三个级别(或者说是“book”)。

通过对体系结构以这种方式进行划分,为实现可以选择价格/性能比平衡的复杂性级别留出了空间,同时还保持了实现间的代码兼容性。

Book I. 用户指令集体系结构(Power ISA User Instruction Set Architecture)定义了通用于所有PowerPC 实现的用户指令和寄存器的基本集合。

这些是非特权指令,为大多数程序所用。

Book II. 虚拟环境体系结构(Power ISA Virtual Environment Architecture)定义了常规应用软件要求之外的附加的用户级功能,比如高速缓存管理、原子操作和用户级计时器支持。

虽然这些操作也是非特权的,但是程序通常还是通过操作系统调用来访问这些函数。

Book III. 操作环境体系结构(Power ISA Operating Environment Architecture)定义了操作系统级需要和使用的操作。

其中包括用于内存管理、异常向量处理、特权寄存器访问、特权计时器访问的函数。

Book III 中详细说明了对各种系统服务和功能的直接硬件支持。

由于我目前手上的开发板是基于e600内核,所以我在学习PowerPC指令集的过程中,顺便总结了e600内核常用的指令集,如果大家发现我总结的指令集有错误或者不准确的地方,欢迎留言指出来,O(∩_∩)O~第二部分e600指令集飞思卡尔的e600内核实现了booke内核构架中64位指令集的中的32位指令(即在e600的32位寄存器中,第0位相当于booke中的64寄存器的第32位,第31位相当于booke中64寄存器的第63位),E600内核采用大端编码方式,指令的第0位是MSB(Most Significant Bit)位,第31位是LSB(Least Significant Bit)。

PPC汇编入门指南

PPC汇编入门指南

看懂PowerPC汇编,需要如下3方面的知识:1.PowerPC指令集架构即Power ISA,可以从获得,包括寄存器定义,数据模型,寻址方式和指令定义以及指令助记符;2.PowerPC ABI即应用程序二进制接口,即寄存器的使用规范和栈调用结构;3.PowerPC Pseudo-ops,即.text, .align n等汇编语言中常用的伪操作符。

PowerPC ISA分为3个级别即“Book”,分别对应于用户指令集体系结构,虚拟环境体系结构和操作环境体系结构。

其中Book III分化出了服务器版本Book III-S(经典PowerPC架构)和嵌入式版本Book III-E(专门为嵌入式优化的版本)。

1.寄存器定义:PowerPC处理器寄存器分为2大类-专用寄存器和非专用寄存器。

其中,非专用寄存器包括32个通用目的寄存器(GPR),32个浮点寄存器(FPR),条件寄存器(CR),浮点状态和控制寄存器(FPSCR);专用寄存器主要包括连接寄存器(LR),计数寄存器(CTR),机器状态寄存器(MSR)以及时间基准寄存器(TBL/TBU)等等。

PPC4xx系列处理器还有DCR寄存器,需要用专门的指令访问。

这里有两点需要注意:1. PowerPC处理器可以运行于两个级别,即用户模式和特权模式。

用户模式下,仅有GPR,FPR,CR,FPSC R,LR,CTR,XER以及TBL/TBU可以访问。

从Power ISA2.05开始,DCR寄存器也可以在通过用户模式DC R访问指令进行访问。

2.PowerPC处理器没有专用的栈指针寄存器和PC指针寄存器,也就是说硬件不负责维护调用栈。

2.数据模型:PowerPC支持如下数据格式:byte, halfword, word, doubleword,quadword, 同时默认支持big-endian 字节序,即MSB(最高有效字节,例如0x12345678中0x12即MSB)保存在低地址。

PowerPC

PowerPC
1993
IBM推出可升级的POWER并行系统,这是第一款采用RS/6000技术,基于微处理器的超级计算机。
谢谢观看
系统接口单元SIU的功能是提供内部总线和外部总线的接口,该接口单元具有32位微处理器的几乎所有的通 用接口特性,尽管Power PC核内部总线为32位,但通过SIU可以将外部总线宽度动态地配置成8、16或32位,以 兼容数据总线宽度为8、 16或32位的外设或存储器。
SIU单元中的存储器控制器支持最多与高达8组存储器的无缝连接,每组的容量从32K字节到256M字节可变, 数据总线宽度可由4个独立的使能信号控制为8bits,16bits或32bits。支持的存储器类型包括SRAM、SSRAM、 EPOM、Flash ROM、DRAM,SDRAM等。存储器控制器为每一组存储器分别提供了可选的0到15个的等待状态以适应 不同速度的存储器。SIU也支持其它需要双时钟访问的外部SRAM和用突发方式访问的外部设备。
PowerPC处理器有 32个(32位或 64位)GPR(通用寄存器)以及诸如 PC(程序计数器,也称为 IAR/指令 寄存器或 NIP/下一指令指针)、LR(链接寄存器)、CR(条件寄存器)等各种其它寄存器。有些 PowerPC CPU 还有 32个 64位 FPR(浮点寄存器)。
PowerPC体系结构是 RISC(精简指令集计算)体系结构的一个示例。因此:
联盟运作
联盟运作
联盟三巨头,个个有来头,因此联盟采行的是松散制联盟。也就是说,联盟的目标一致,但彼此并没有隶属 关系,运作时也难以强制成员遵行。不过联盟负责制定规格、进行授权与认证等相关工作。
分工方面,摩托罗拉主司芯片设计、制造。苹果电脑则是负责操作系统,还有组装及销售。IBM不愧是信息 界的全能选手,他从上游的芯片设计、制造,到中游的系统整合、测试、操作系统,及下游的组装、销售,不但 能全面参与,向来亦是个中好手。

power pc指令类型特点

power pc指令类型特点

power pc指令类型特点
PowerPC(PPC)是一种RISC(精简指令集计算机)架构,其指令集具有一些特点,包括以下内容:
1.精简指令集:PowerPC采用了精简指令集(RISC)的设计原则,其指令集相对较小且精简。

这有助于提高指令执行速度和简化处理器的设计。

2.固定长度指令:PowerPC的指令长度通常是固定的,这使得指令的解码和执行更加高效。

指令通常是32位长,但也有64位版本。

3.多寄存器操作:PowerPC支持多寄存器操作,允许在一条指令中同时对多个寄存器执行操作。

这提高了并行性和性能。

4.延迟槽:PowerPC采用了延迟槽的设计,允许在分支指令之后执行前一个指令。

这可以提高分支指令的效率。

5.浮点运算支持:PowerPC架构具有强大的浮点运算支持,包括一组浮点寄存器和一套浮点指令。

6.立即数操作:PowerPC允许立即数操作,即在指令中直接指定常数值,而不需要从内存中加载。

7.负载/存储架构:PowerPC采用了典型的负载/存储架构,即大部分操作都是在寄存器之间进行,而内存访问需要专门的负载(Load)和存储(Store)指令。

8.大端序和小端序:PowerPC支持两种字节序,即大端序和小端序,这允许在不同体系结构之间进行数据交换。

这些特点使PowerPC成为一种高性能和灵活的架构,广泛用于多种应用领域,包括个人计算机、服务器、嵌入式系统和超级计算机。

不过,需要注意的是,随着时间的推移,一些基于PowerPC架构的产品逐渐被其他架构所取代。

PPC汇编入门指南

PPC汇编入门指南

看懂PowerPC汇编,需要如下3方面的知识:1.PowerPC指令集架构即Power ISA,可以从获得,包括寄存器定义,数据模型,寻址方式和指令定义以及指令助记符;2.PowerPC ABI即应用程序二进制接口,即寄存器的使用规范和栈调用结构;3.PowerPC Pseudo-ops,即.text, .align n等汇编语言中常用的伪操作符。

PowerPC ISA分为3个级别即“Book”,分别对应于用户指令集体系结构,虚拟环境体系结构和操作环境体系结构。

其中Book III分化出了服务器版本Book III-S(经典PowerPC架构)和嵌入式版本Book III-E(专门为嵌入式优化的版本)。

1.寄存器定义:PowerPC处理器寄存器分为2大类-专用寄存器和非专用寄存器。

其中,非专用寄存器包括32个通用目的寄存器(GPR),32个浮点寄存器(FPR),条件寄存器(CR),浮点状态和控制寄存器(FPSCR);专用寄存器主要包括连接寄存器(LR),计数寄存器(CTR),机器状态寄存器(MSR)以及时间基准寄存器(TBL/TBU)等等。

PPC4xx系列处理器还有DCR寄存器,需要用专门的指令访问。

这里有两点需要注意:1. PowerPC处理器可以运行于两个级别,即用户模式和特权模式。

用户模式下,仅有GPR,FPR,CR,FPSC R,LR,CTR,XER以及TBL/TBU可以访问。

从Power ISA2.05开始,DCR寄存器也可以在通过用户模式DC R访问指令进行访问。

2.PowerPC处理器没有专用的栈指针寄存器和PC指针寄存器,也就是说硬件不负责维护调用栈。

2.数据模型:PowerPC支持如下数据格式:byte, halfword, word, doubleword,quadword, 同时默认支持big-endian 字节序,即MSB(最高有效字节,例如0x12345678中0x12即MSB)保存在低地址。

PowerPC常用指令

PowerPC常用指令

查看文章PowerPC常用指令2009年05月14日星期四 22:20 指令缩写-------------------------st = storeld = loadr = rightl = left 或者 logicalw = wordu = updatem = movef = from 或者 fieldt = to 或者 thani = Immediateh = half wordz = zerob = branchn = andcmp = comparesub = subtractclr = clearcr = condition registerlr = link registerctr = couter registerstwu = STore Word witch Updatestwu r1, <-frame_size>(r1)--------------------------------在GDB/IDA汇编中通常写成stwu %sp, -0×20(%sp)意思是,先将SP放入到(SP-20)这个内存地址然后SP = SP - 20;从特殊寄存器取值的扩展助记符-------------------------mflr = Move From Link Registermflr rt 等同于 mfspr rt,8将连接寄存器的值放到RT一般是mflr %r0存值到特殊寄存器的扩展助记符-------------------------mtctr = Move To Counter Registermtctr rs 等同 mtspr 9,rs将RS的值放入到计数寄存器mtcrf = Move to Condition Register Fields mtcrf FXM, RS按照掩码FXM,复制Rs的内容到CRFXM是8位,控制 RS的32位(8组,共32位)复制过去,也就是说 FXM的1位,可以控制Rs的4位一位掩码控制一组CR条件寄存器扩展助记符-------------------------crclr = Control Register CLeaRcrclr bx 等同于 crxor bx, bx, bx 作用是将条件寄存器相应的位清零例如crclr so 等同于 crxor 3, 3, 3 将CR0的SO位(第3位)清零crclr 4*cr3+eq 等同于 crxor 14, 14, 14 将CR3的EQ位清零比较指令-------------------------cmpli = Compare Logical Immediatecmplwi bf, ra, ui 等同于 cmpli bf, 0, ra, uiCompare Logical Word Immediate所谓逻辑比较,就是同无符号整数比较存储指令-------------------------sth = Store Half 并且是存储高位 (16-31位)载入指令-------------------------lhz = Load Half and Zero 载入半字并将高16位清零lwzx = Load Word and Zero Indexed 意思是 lwzx RT, RA, RB (Ra+Rb就是地址)跳转-------------------------bccl = bctrl (有别名的助记符)Branch Conditional to Count Register条件跳转到计数寄存器指定的地址逻辑操作-------------------------ori 或者 oril = OR Immediate 同16位立即数进行或操作循环掩码操作循环左移然后进行掩码操作是PowerPC指令集的精华,包含了一组非常强大的指令集移位指令-------------------------slwi = Shift left immediate 左移几位(位数用立即数表示)rotlwi = Rotate left immediate 循环左移抽取-------------------------extrwi = Extract and right justify immediate例如 extrwi RX, RY, 1, 0等同于 rlwinm RX, RY, 1, 31, 31rlwinm or rlinm (Rotate Left Word Immediate Then AND with Mask)清除-------------------------clrlwi = Clear left immediate怪异清除clrlslwi = Clear (Left Word) and Shift Left clrlslwi %r0, %r0, 24,8 等同于rlwinm RA, RS, 24-8, 31-24 =rlwinm Ra, Rs, 16, 7rlwinm RA, RS, SH, MB, ME将R0向左循环移动掩码是 [8, 15]影响CR的运算-------------------------如果Overflow Exception(OE)设置1,那么结果影响定点异常寄存器的Summary Overflow(SO)和 Overflow(OV),助记符是后面加o, addo如果Record(Rc)设置1,那么结果影响Less Than(LT) zero, Greater Than (GT) zero, Equal To (EQ) zero,和Summary Overflow (SO)等条件寄存器CR助记符是后面加”点” add.算术运算-------------------------注意方向subf = Subtract From 注意,被减数是后面的那个寄存器计数器循环在扩展助记符中,计数寄存器的语义可以通过在b后面立即添加dz或 dnz来指定。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PowerPC汇编指令集标签:汇编指令PowerPC PPC 2008-05-04 21:25PowerPC 体系结构规范(PowerPC Architecture Specification)发布于 1993 年,它是一个 64 位规范 ( 也包含 32 位子集 )。

几乎所有常规可用的 PowerPC(除了新型号 IBM RS/6000 和所有 IBM pSeries 高端服务器)都是 32 位的。

PowerPC 处理器有 32 个(32 位或 64 位)GPR(通用寄存器)以及诸如 PC (程序计数器,也称为IAR/指令地址寄存器或 NIP/下一指令指针)、LR(链接寄存器)、CR(条件寄存器)等各种其它寄存器。

有些 PowerPC CPU 还有 32 个 64 位 FPR(浮点寄存器)。

MPC555使用的PowerPC CPU是带有FPR 的。

一些常用寄存器介绍如下:通用寄存器的用途:r0在函数开始(function prologs)时使用。

r1堆栈指针,相当于ia32架构中的esp寄存器,idapro把这个寄存器反汇编标识为sp。

r2内容表(toc)指针,idapro把这个寄存器反汇编标识为rtoc。

系统调用时,它包含系统调用号(这个好像跟系统有关吧)。

r3作为第一个参数和返回值。

r4-r10函数或系统调用开始的参数。

r11用在指针的调用和当作一些语言的环境指针。

r12它用在异常处理和glink(动态连接器)代码。

r13保留作为系统线程ID。

r14-r31 作为本地变量,非易失性。

专用寄存器的用途:lr链接寄存器,它用来存放函数调用结束处的返回地址。

ctr计数寄存器,它用来当作循环计数器,会随特定转移操作而递减。

xer定点异常寄存器,存放整数运算操作的进位以及溢出信息。

msr机器状态寄存器,用来配置微处理器的设定。

cr条件寄存器,它分成8个4位字段,cr0-cr7,它反映了某个算法操作的结果并且提供条件分支的机制。

寄存器r1、r14-r31是非易失性的,这意味着它们的值在函数调用过程保持不变。

寄存器r2也算非易失性,但是只有在调用函数在调用后必须恢复它的值时才被处理。

寄存器r0、r3-r12和特殊寄存器lr、ctr、xer、fpscr是易失性的,它们的值在函数调用过程中会发生变化。

此外寄存器r0、r2、r11和r12可能会被交叉模块调用改变,所以函数在调用的时候不能采用它们的值。

条件代码寄存器字段cr0、cr1、cr5、cr6和cr7是易失性的。

cr2、cr3和cr4是非易失性的,函数如果要改变它们必须保存并恢复这些字段。

在AIX上,svca指令(sc是PowerPC的助记符)用来表示系统调用,r2寄存器指定系统调用号,r3-r10寄存器是给该系统调用的参数。

在执行系统调用指令之前有两个额外的先决条件:LR寄存器必须保存返回系统调用地址的值并且在系统调用前执行crorc cr6, cr6, cr6指令(?)。

应用程序二进制接口(ABI)从技术而言,开发人员可以将任一 GPR 用于任何操作。

例如,由于不存在:“堆栈指针寄存器”,为此程序员就可以使用任何寄存器。

实际上,定义一组约定很有用,这样二进制对象就可以与不同的编译器和预先编写好的汇编代码进行互操作。

调用约定是由使用的 ABI(应用程序二进制接口)决定的。

ppc32Linux 和 NetBSD 实现使用SVR4(System V R4)ABI,而 ppc64 Linux 仿效了 AIX,使用 PowerOpen ABI。

ABI 还指定当调用子例程时哪些寄存器被认为是易失型的(调用者保存(caller-save))以及哪些被认为是非易失型的(被调用者保存(callee-save)),以及许多其它内容。

SVR4 ABI 指定了一些行为的具体示例:-由于 PowerPC 拥有如此多的 GPR(32 个,而相比之下 IA32 只有 8 个),所以传递参数的寄存器从gpr3开始。

-寄存器 gpr3 到 gpr12 是易失型的(调用者保存)寄存器,如果需要的话,在调用子例程之前必须先保存它们并在返回之后恢复它们。

-寄存器gpr1 用来作为栈帧指针。

指令格式PowerPC指令包括操作码和操作数两部分,PowerPC支持三操作数的指令格式。

如算术指令:add rD,rA,rB表示把(rA)+(rB)的和存放到rD寄存器中。

注意:指令中的点号“.”表示:指令将更新条件寄存器CR0。

如add. rD,rA,rB。

结构和操作环境体系结构。

其中Book III分化出了服务器版本Book III-S(经典PowerPC 架构)和嵌入式版本Book III-E(专门为嵌入式优化的版本)。

1.寄存器定义:PowerPC处理器寄存器分为2大类-专用寄存器和非专用寄存器。

其中,非专用寄存器包括32个通用目的寄存器(GPR),32个浮点寄存器(FPR),条件寄存器(CR),浮点状态和控制寄存器(FPSCR);专用寄存器主要包括连接寄存器(LR),计数寄存器(CTR),机器状态寄存器(MSR)以及时间基准寄存器(TBL/TBU)等等。

PPC4xx系列处理器还有DCR寄存器,需要用专门的指令访问。

这里有两点需要注意:1. PowerPC处理器可以运行于两个级别,即用户模式和特权模式。

用户模式下,仅有GPR,FPR,CR,FPSCR,LR,CTR,XER以及TBL/TBU可以访问。

从Power ISA2.05开始,DCR寄存器也可以在通过用户模式DCR访问指令进行访问。

2.PowerPC处理器没有专用的栈指针寄存器和PC指针寄存器,也就是说硬件不负责维护调用栈。

2.数据模型:PowerPC支持如下数据格式:byte, halfword, word, doubleword,quadword, 同时默认支持big-endian字节序,即MSB(最高有效字节,例如0x12345678中0x12即MSB)保存在低地址。

little-endian字节序可以通过修改设置支持。

注意:PowerPC习惯, msb(最高有效位)为bit0,lsb为bit31.3.寻址方式PowerPC没有专门的IO操作指令,所有地址访问一视同仁,并且只支持地址和寄存器之间的访问。

因此寻址方式非常简单,可以概括为2类6种:3.1 Load/store/算术/逻辑/cache指令:a)寄存器间接寻址模式,通常写作RA或者RB;b)寄存器间接立即数索引寻址模式,即(基址寄存器+立即数偏移)寻址模式,通常写作d(RA);c)寄存器间接索引寻址模式(基址寄存器 + 偏移寄存器)寻址模式,通常写作RA,RB。

注意:对于三种模式,若寄存器为GPR0,则其内容被忽略,并以0代替其内容。

3.2 跳转指令:a)立即数寻址模式;b)链接寄存器(LR)模式,即目的地址被保存在LR中;c)计数寄存器(CTR)模式,即目的地址保存在CTR中。

注意:实际上还有一些特殊的跳转指令rfi/rfci/rfmci,其目的地址保存在SRR0/CSRR0/MCSRR0中。

4.指令定义和指令助记符:PowerPC指令的长度都是4字节,但是种类繁多,而且有些指令极其复杂。

因此,通常情况下,PowerPC汇编编程中采用指令和助记符混用的方式。

助记符主要用来简化内存访问、算术运算、逻辑运算等常用指令,例如用bne target代替bc 4,2,target表示不为零则跳转。

下面仅以一些常见的汇编代码片段来做一些简单的归纳,具体信息请参考相应的处理器core用户手册或者Power ISA。

注意,cache和MMU指令会跟其实现一起介绍,此处不再赘述。

4.1 读取一个word(0x12345678)到目的寄存器lis RA,0x12345678@h /* 高16位(0x1234)偏移16位后变成0x12340000放进RA */ori RB, RA, 0x12345678@l /* RA与低16位(0x5678)相或后构成完整数据放进RA */注意:PowerPC指令中,i后缀表示立即数,s后缀表示左移16位。

例如addi、addis、ori、oris等。

这段代码也可以用来读取某个变量的值,只需要把立即数替换成变量名。

2.从某个地址(0x56789abc)读取数据lis RA,0x56789abc@ha /* 调整后的高16位(0x5679)偏移16位后变成(0x56790000)放进RA */lwz RB, 0x56789abc@l (RA) /* RA加上低16位(0xffff9abc)构成完整数据地址,然后将其内容放进RB */注意:∙@l,@h和@ha:用于算术运算的操作数(包括addi的操作数)时,@l获取的是符号扩展的低16位数据(0xffff9abc) ,因此高16位必须进行根据bit15进行调整,而不能简单的使用@h来获取。

∙load/store指令的通常格式为(l/st)(w/h/b)(z/br)(u/x) RA,…. 其中l代表读取数据到RA 中;st代表将RA的内容写入内存;w/h/b分别代表针对word、halfword/byte进行操作;z仅用于读取数据,代表字或者半字读到寄存器中后将其高位清零(注意:对word的读取无意义,但必须加);br代表读取后或者存入前对数据进行字节序反转;u代表从某个内存地址读取数据后,同时更新保存内存地址的寄存器;x代表使用寄存器间接索引寻址模式(基址寄存器 + 偏移寄存器)寻址模式(默认使用寄存器间接立即数索引寻址模式)∙这段代码也可以用来访问数组或者结构中的某个成员,或者指针指向的地址块中的数据,只需把立即数换成相应的数组名、结构名或者指针即可。

3.入栈/出栈操作入栈:stwu 1, –16(1) /* 原始栈指针GPR1保存在新栈顶(原始栈指针减去16)*/mflr 0 /* LR暂存在GPR1 */stw 0, 20(1) /* 保存LR到调用者的栈中 */出栈:lwz 0, 20(1) /* LR出栈 */mtlr 0 /* 恢复LR */addi r1, r1, 16 /* 销毁栈 */注意:栈定义会在ABI部分详细解释,此处不再赘述。

4.循环li 0, 10 /* 循环次数暂存入GPR0 */mtctr 0 /* 更新计数寄存器 CTR*/label:… /* 需要重复执行的指令 */bdnz label /* 递减计数器,不等于0则跳转到标号处重复执行 */注意:∙label类似于C语言中的标号,因此在同一段代码中,不能重复。

因此,习惯中使用数字标号来代替。

数字标号作为跳转指令的目的地址时,通常在其后一个b表示向最近的低地址数字标号跳转,加f表示向最近的高地址数字标号跳转。

相关文档
最新文档