欢迎来到天天文库
浏览记录
ID:11526452
大小:43.50 KB
页数:9页
时间:2018-07-12
《ppc 汇编入门指南》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、看懂PowerPC汇编,需要如下3方面的知识: 1.PowerPC指令集架构即PowerISA,可以从Power.org获得,包括寄存器定义,数据模型,寻址方式和指令定义以及指令助记符; 2.PowerPCABI即应用程序二进制接口,即寄存器的使用规范和栈调用结构; 3.PowerPCPseudo-ops,即.text,.alignn等汇编语言中常用的伪操作符。 PowerPCISA分为3个级别即“Book”,分别对应于用户指令集体系结构,虚拟环境体系结构和操作环境体系结构。其中BookIII
2、分化出了服务器版本BookIII-S(经典PowerPC架构)和嵌入式版本BookIII-E(专门为嵌入式优化的版本)。 1.寄存器定义: PowerPC处理器寄存器分为2大类-专用寄存器和非专用寄存器。其中,非专用寄存器包括32个通用目的寄存器(GPR),32个浮点寄存器(FPR),条件寄存器(CR),浮点状态和控制寄存器(FPSCR);专用寄存器主要包括连接寄存器(LR),计数寄存器(CTR),机器状态寄存器(MSR)以及时间基准寄存器(TBL/TBU)等等。PPC4xx系列处理器还有DCR寄
3、存器,需要用专门的指令访问。这里有两点需要注意: 1.PowerPC处理器可以运行于两个级别,即用户模式和特权模式。用户模式下,仅有GPR,FPR,CR,FPSCR,LR,CTR,XER以及TBL/TBU可以访问。从PowerISA2.05开始,DCR寄存器也可以在通过用户模式DCR访问指令进行访问。 2.PowerPC处理器没有专用的栈指针寄存器和PC指针寄存器,也就是说硬件不负责维护调用栈。2.数据模型: PowerPC支持如下数据格式:byte,halfword,word,doublewo
4、rd,quadword,同时默认支持big-endian字节序,即MSB(最高有效字节,例如0x12345678中0x12即MSB)保存在低地址。little-endian字节序可以通过修改设置支持。 注意:PowerPC习惯,msb(最高有效位)为bit0,lsb为bit31.3.寻址方式 PowerPC没有专门的IO操作指令,所有地址访问一视同仁,并且只支持地址和寄存器之间的访问。因此寻址方式非常简单,可以概括为2类6种: 3.1Load/store/算术/逻辑/cache指令: a)寄存
5、器间接寻址模式,通常写作RA或者RB; b)寄存器间接立即数索引寻址模式,即(基址寄存器+立即数偏移)寻址模式,通常写作d(RA); c)寄存器间接索引寻址模式(基址寄存器+偏移寄存器)寻址模式,通常写作RA,RB。 注意:对于三种模式,若寄存器为GPR0,则其内容被忽略,并以0代替其内容。 3.2跳转指令: a)立即数寻址模式; b)链接寄存器(LR)模式,即目的地址被保存在LR中; c)计数寄存器(CTR)模式,即目的地址保存在CTR中。 注意:实际上还有一些特殊的跳转指令rfi/
6、rfci/rfmci,其目的地址保存在SRR0/CSRR0/MCSRR0中。4.指令定义和指令助记符: PowerPC指令的长度都是4字节,但是种类繁多,而且有些指令极其复杂。因此,通常情况下,PowerPC汇编编程中采用指令和助记符混用的方式。助记符主要用来简化内存访问、算术运算、逻辑运算等常用指令,例如用bnetarget代替bc4,2,target表示不为零则跳转。下面仅以一些常见的汇编代码片段来做一些简单的归纳,具体信息请参考相应的处理器core用户手册或者PowerISA。注意,cache
7、和MMU指令会跟其实现一起介绍,此处不再赘述。 4.1读取一个word(0x12345678)到目的寄存器 lisRA,0x12345678@h/*高16位(0x1234)偏移16位后变成0x12340000放进RA*/ oriRB,RA,0x12345678@l/*RA与低16位(0x5678)相或后构成完整数据放进RA*/ 注意:PowerPC指令中,i后缀表示立即数,s后缀表示左移16位。例如addi、addis、ori、oris等。这段代码也可以用来读取某个变量的值,只需要把立即数替换
8、成变量名。 2.从某个地址(0x56789abc)读取数据 lisRA,0x56789abc@ha/*调整后的高16位(0x5679)偏移16位后变成(0x56790000)放进RA*/ lwzRB,0x56789abc@l(RA)/*RA加上低16位(0xffff9abc)构成完整数据地址,然后将其内容放进RB*/ 注意:·@l,@h和@ha:用于算术运算的操作数(包括addi的操作数)时,@l获取的是符号扩展的低16位数据(0xffff9ab
此文档下载收益归作者所有