32位PowerPC常用指令集总结

合集下载

32位PowerPC构架通用寄存器分析及总结一

32位PowerPC构架通用寄存器分析及总结一

32位PowerPC构架通用寄存器分析及总结一第一部分 32位 PowerPC构架下寄存器概述32 位PowerPC构架寄存器模型可以分成三个类级别:UISA,VEA,OEA,我们根据这三个级别把PowerPC所使用的所有寄存器分为三类:第一类:用户指令集构架(UISA-User Instruction Set Architecture)下所使用的寄存器;第二类:虚拟环境构架(VEA-Virtual Environment Architecture)下所使用的寄存器;第三类:操作系统环境(OEA-Operating Environment Architecture)下所使用的寄存器;PowerPC指令集构架为所有的算术逻辑运算指令定义了“寄存器到寄存器”格式的指令,这些指令的操作数来自或者来自于寄存器,或者来自于指令中的立即数。

而对于“三寄存器”格式的指令,PowerPC指令集定义其中一个寄存器用来存目的操作数,另外两个寄存器用来存放源操作数。

这样的话,存放源操作数的寄存器还可以被其它指令使用,从而减少了某些操作的指令数目。

并且对于访问寄存器,PowerPC构架定义了明确的load和store访存指令(这是RISC指令集的典型特点)。

备注:寄存器中的保留位允许软件写任何值(其实就是0或者1),但是读出来的值,未必是我们写出来的值。

它的值依赖于具体的执行系统。

接下来,我们分别来介绍这三类寄存器。

第二部分 UISA寄存器集合用户模式下的寄存器可以被所有的用户级软件和特权级软件所使用,它包含以下的寄存器:32个通用寄存器GPRs(General-purpose registers):GPR0-GPR31;32个浮点寄存器FRPs(Floating-point registers):FPR0-FPR31;1个条件寄存器:CR(Condition register);1个XER寄存器;1个LR(Link register)寄存器;1个CTR(Count register)寄存器;1个浮点状态控制寄存器:FPSCR(Floating-point status and control register);备注:不管是单精度数还是双精度数,在浮点寄存器中都是以双精度格式存储。

PowerPC总汇编指令集

PowerPC总汇编指令集

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,它反映了某个算法操作的结果并且提供条件分支的机制。

16位与32位汇编语言常用指令总结

16位与32位汇编语言常用指令总结

16位与32位汇编语言常用指令总结在计算机编程领域,汇编语言被广泛应用于底层程序设计,直接操作计算机硬件。

其中,16位和32位汇编语言是常见的两种类型。

本文将总结这两种汇编语言中常用的指令,帮助读者更好地理解和应用它们。

一、16位汇编语言常用指令1. 数据传送指令- MOV:将数据从一个寄存器或内存位置传送到另一个寄存器或内存位置。

- XCHG:交换两个寄存器或内存位置的数据。

2. 算术运算指令- ADD/SUB:实现加法和减法运算。

- MUL/IMUL:实现无符号与有符号乘法运算。

- DIV/IDIV:实现无符号与有符号除法运算。

3. 逻辑运算指令- AND/OR/XOR:实现与、或、异或逻辑运算。

- NOT:对操作数进行按位取反操作。

4. 条件转移指令- JMP:无条件跳转到指定地址。

- JZ/JNZ:根据零标志位(ZF)的值进行跳转。

- JC/JNC:根据进位标志位(CF)的值进行跳转。

5. 循环指令- LOOP:根据计数器的值进行循环。

- JCXZ/JECXZ:根据CX/ECX寄存器的值进行循环。

二、32位汇编语言常用指令1. 数据传送指令- MOV:同16位汇编语言中的指令,用于数据传送。

- PUSH/POP:将数据推入栈或从栈中弹出。

2. 算术运算指令- ADD/SUB:同16位汇编语言中的指令,用于加法和减法运算。

- MUL/IMUL:同16位汇编语言中的指令,用于乘法运算。

- DIV/IDIV:同16位汇编语言中的指令,用于除法运算。

3. 逻辑运算指令- AND/OR/XOR:同16位汇编语言中的指令,用于逻辑运算。

- NOT:同16位汇编语言中的指令,用于按位取反。

4. 条件转移指令- JMP:同16位汇编语言中的指令,用于无条件跳转。

- JZ/JNZ:同16位汇编语言中的指令,根据零标志位(ZF)进行跳转。

- JB/JNB:根据低位借位标志位(CF)进行跳转。

5. 循环指令- LOOP:同16位汇编语言中的指令,用于循环操作。

32位微机原理指令汇总

32位微机原理指令汇总

注意:::红笔写的为根据课本该写的,可能有错!!!一、数据传输指令作用:它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.1. 通用数据传送指令.MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压入堆栈.POP 把字弹出堆栈.PUSH把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. PUSHA 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器里字节的顺序XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )XADD 先交换再累加.( 结果在第一个操作数里)XLAT 字节查表转换.BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即0-FFH); 返回AL 为查表结果. ( [BX+AL]->AL )2. 输入输出端口传送指令.IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器)输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时,其范围是0-65535.3. 目的地址传送指令.LEA 装入有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装入AH.SAHF 标志寄存器传送,把AH内容装入标志寄存器. PUSHF 标志入栈.POPF 标志出栈.PUSHD 32位标志入栈.POPD 32位标志出栈.二、算术运算指令ADD 加法.ADC 带进位加法.INC 加1.AAA 加法的ASCII码调整.DAA 加法的十进制调整.SUB 减法.SBB 带借位减法.DEC 减1.NEC 求反(以0 减之).CMP 比较.(两操作数作减法,仅修改标志位,不回送结果). AAS 减法的ASCII码调整.DAS 减法的十进制调整.MUL 无符号乘法.IMUL 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法的ASCII码调整.DIV 无符号除法.IDIV 整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去) CWD 字转换为双字. (把AX中的字的符号扩展到DX中去) CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去) CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去) 三、逻辑运算指令AND 与运算.OR 或运算.XOR 异或运算.NOT 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果). SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上八种移位指令,其移位次数可达255次. 移位一次时, 可直接用操作码. 如SHL AX,1. 移位>1次时, 则由寄存器CL给出移位次数. 如MOV CL,04SHL AX,CL四、串指令DS:SI 源串段寄存器:源串变址.ES:DI 目标串段寄存器:目标串变址.CX 重复次数计数器.AL/AX 扫描值.D标志0表示重复操作中SI和DI应自动增量; 1表示应自动减量.Z标志用来控制扫描或比较操作的结束.MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )CMPS 串比较.( CMPSB 比较字符. CMPSW 比较字. )SCAS 串扫描.把AL或AX的内容与目标串作比较,比较结果反映在标志位.LODS 装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. ) STOS 保存串.是LODS的逆过程.REP 当CX/ECX<>0时重复.REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.REPC 当CF=1且CX/ECX<>0时重复.REPNC 当CF=0且CX/ECX<>0时重复.五、程序(控制)转移指令1>无条件转移指令(长转移)JMP 无条件转移指令CALL 过程调用RET/RETF过程返回.2>条件转移指令(短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 )一测试无符号整数运算的结果(标志C和Z).JA/JNBE 不小于或不等于时转移.JAE/JNB 大于或等于或者进位为0转移.JB/JNAE 小于等于或者进位为1转移.JBE/JNA 小于或等于转移.二测试带符号整数运算的结果(标志S,O和Z).JG/JNLE 大于转移.JGE/JNL 大于或等于转移.JL/JNGE 小于转移.JLE/JNG 小于或等于转移.三根据单个条件标志位转移的条件转移指令。

32位PowerPC构架通用寄存器分析及总结三

32位PowerPC构架通用寄存器分析及总结三

32位PowerPC构架通用寄存器分析及总结三4.6SR(Segment Registers)寄存器OEA定义了16个32位的SR寄存器,段寄存器SR可以使用mtsr/mfsr,mtsrin/mfsrin指令进程访问。

随着CR[0]位(我们称之为T位)的值的不同,CR寄存器有两种不同的格式。

当T位为1时格式如下:CR[1]位:系统模式保护位CR[2]位:用户模式保护位CR[3]位:不可执行保护位CR[4:7]位:保留位CR[8:31]位:VSID位,我们在4.5节页面地址映射中已经看到该位段的作用。

当T位为0时格式如下:CR[1]位:系统模式保护位CR[2]位:用户模式保护位CR[3]位:不可执行保护位CR[3:11]位:Bus unit IDCR[12:31]位:Device-specific data for I/O controller备注:这个位段,我现在不清楚,暂时附上datasheet原文,以后再修改O(∩_∩)O~4.7 DAR(Data Address Register)寄存器存放访存指令产生的引发中断的有效地址,比较简单。

格式如下:4.8 SPRG0–SPRG3寄存器提供给操作系统使用,格式如下:SPRG0:操作系统可能会加载一个独立的物理地址到该寄存器中,来标识一个内存区域是第一级的中断句柄专用的。

SPRG2:可以被第一级的中断来保存通用寄存器的内容,该内容可以作为内存中保存其它通用寄存器的基地址。

SPRG2和SPRG3可以在操作系统需要时使用!备注:E600有8个SPRGs寄存器。

4.9 DSISR寄存器用来决定DSI中断的中断源,格式如下:4.10 SRR0(Machine Status Save/Restore Register 0)寄存器当发生中断时,SRR0用来保持中断发生的那一刻MSR的状态,当中断返回结束执行rfi指令时,SRR0用来恢复MSR寄存器的值,它也可以用来保持系统调用之前的那条指令的有效地址,当系统中断结束时会执行rfi指令,汇编SPR0保持的地址赋值给NIA(Next Instruction Address)寄存器(也就是我们通常说的PC寄存器)格式如下:4.11 SRR1(Machine Status Save/Restore Register 1)该寄存器同4.104.12 FPECR(Floating-Point Exception Cause Register)FPECR寄存器用来支持产生浮点中断的原因。

PowerPC常用指令集合

PowerPC常用指令集合

PowerPC常用指令集合PowerPC常用指令指令缩写-------------------------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 T o 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来指定。

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来指定。

PowerPC汇编指令集简析

PowerPC汇编指令集简析

PowerPC汇编指令集简析在了解PowerPC汇编指令前,需要先看下编程所用的寄存器模型,PowerPC 系统结构为大多数运算指令都定义了Register-Register的操作,这些操作的源操作数从寄存器取得,或作为嵌入指令操作码中的立即数提供。

这里的e300核可分为用户编程模型和管理员编程模型,该模型有32个GPR、32个FPR、特殊目的寄存器SPR和一些功能寄存器,下图为二者的示意图:上面这些寄存器可能不太好理解,因为名字和Intel汇编不一样,其实,可以这样理解,GPR就相当于EAX/EBX/ECX,而CTR则完全就是ECX的功能,是吧?区别就是没有堆栈而已咯。

CR被分为8段,每段4位,分别代表LT、GT、EQ和SO(小于、大于、等于和溢出);LR用于记录跳转地址;特殊寄存器XER用于记录溢出和进位标志;FPSCR用于记录浮点运算类型和异常等。

再看下指令集,大部分的CPU指令集可分为:数据读写、数值计算、流程控制和设备管理四个部分,由于PowerPC使用RISC,指令字长为32bit,Endian一般是可调的,默认为大端,另外,PowerPC没有栈,所以程序需要自己实现相关操作。

首先为运算和逻辑指令,列举如下:它们与通用寄存器有关,源数据来自GPR 或16 位立即数,目的是GPR 寄存器,操作为32 位,GPR 中存放32 位更新数据。

大多数指令都可以根据字面意思理解其作用,注意还有一个“cntlzw”指令,意为计算字中的第一个0,用于在一个字中找到1时将一个指令中的0的数量找出,它在决定例外寄存器中最高优先服务时有用。

下面是数据读写指令,它们对数据在存储器中核通用寄存器中的传送很有用,若数据小于传送长度(单字,半字或字节),指令会使数据变位为32位,将不同位填0或符号扩展。

指令列举如下:这里需要注意的是上面列举的lbz和lhz两个指令并不完全等同于moval,[ebx]和mov ax,[ebx+10]这两个,因为前面两个是将字节和半字加载到r3时还清空了高位,而后两条指令只是加载数据到eax,并不会清空高位。

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

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器的第63位),E600内核采用大端编码方式,指令的第0位是MSB(Most Significant Bit)位,第31位是LSB(Least Significant Bit)。

e600内核指令的高6位字段(第0-5位)被称为OPCD字段(Primary Opcode Field),根据OPCD字段的不同,PowerPC的指令集分为以下几类。

2.1 I-form指令格式该类是无条件转移指令。

0-5 6-29 30 31OPCD LI AA LKAA=0,表示LI中存放的是相对地址LI*4,基址是当前指令的地址AA=1,表示LI中存放的是绝对地址LI*4LK=1,表示转移到目的地址的同时,将当前指令的下一条指令存入LR寄存器LK=0,仅仅表示跳转到目的地址,而不用修改LR寄存器例如:b LI//AA=0, LK=0解释:跳转到目的地址:LI*4+当前指令的地址ba LI//AA=1,LK=0解释:跳转到:LI*4bl LI//AA=0,LK=1解释:跳转到目的地址:LI*4+PC,同时把PC+4放入LR寄存器备注:PC放的是当前指令的地址。

bla LI//AA=1,LK=1解释:跳转到目的地址:LI*4,同时把PC+4放入LR寄存器给出一段汇编指令示例:0x1000051c <print>……0x10000568:4b ff ff ff b5 对应汇编:bl 10000051c<print>0x1000056c:38 00 00 00 对应汇编:li r0,0 解释:bl 10000051c<print>对应的机器指令为:4b ff ff ff b5,其中的LK=0xed。

将LK*4符号扩展到32为对应的真值为-0x4c,而当前指令的地址为0x1000056c,所以跳转的目标地址就是0x1000056c+(-0x4c)=0x1000051c即为print函数的入口地址。

因此如果想获得下一条指令的有效地址可以使用下面的汇编代码:bl invstr //将当前指令的下一条指令PC+4放入LR寄存器invstr:mflr r6 //将LR寄存器的内容放入r6寄存器中2.2 B-Form指令格式该类为有条件转移指令0-5 6-10 11-15 16-29 30 31 OPCD BO BI BD AA LK 包含下面4条指令:bc BO, BI, BD //AA=0 LK=0bca BO, BI, BD //AA=1 LK=0bcl BO, BI, BD //AA=0 LK=1bcla BO, BI, BD //AA=1 LK=1解释:AA和LK的含义同上,下面详细介绍一下BO,BI,BD字段的含义。

BO字段:从6位至10位,共5 bit:BO[0]为1:表示根据CTR寄存器是否为0进行转移;为0:根据CR寄存器的相应字段和BI字段中的条件进行转移。

BO[1]为1:指定的条件为真时转移为0:指定的条件为假时转移BO[2]为1:执行bc指令时,CTR寄存器保持不变为0:执行bc指令时,CTR寄存器自减BO[3]为1:CTR寄存器为0时进行条件转移为0:CTR寄存器非0时进行条件转移BO[4]为1:bc指令将被判断为执行转移功能,处理器将预取转移指令目标地址后面的几条指令,并将预先取得的指令放入缓冲对列。

为0:bc指令不被判断为执行转移功能,不预取转移指令目标地址后面的几条指令BI字段(11-15bit)的功能:BI[0-2]的值n(n在0到7之间):指出CR寄存器中的CRn字段的状态作为指令跳转条件BI[3-4]的值表述指令跳转条件,具体如下:00 使用LT(小于)状态作为指令的转移条件01 使用GT(大于)状态作为指令的转移条件10 使用EQ(等于)状态作为指令的转移条件11 使用SO(溢出)状态作为指令的转移条件BD字段(16-29bit):指出转移的目标地址现在我们给我几个例子:bc 16,0,BD解释:BO[0]为1:表示根据CTR寄存器是否为0进行转移,和CR寄存器无关了;BO[2]为0:执行bc指令时,CTR寄存器自减;BO[3]为0:CTR寄存器为非0时进行条件转移;BO[4] 为0:bc指令不被判断为执行转移功能,不预取转移指令目标地址后面的几条指令综上,该指令的意思是将CTR寄存器自减,如果CTR不为0则跳转到BD指示的地址处。

可以使用指令助记符bdnz BD表示,CTR寄存器自减,如果CTR不为0则跳转到BD指示的地址处bc 4,2,BDBO[0]为0根据CR寄存器的相应字段和BI字段在中的条件进行转移。

BO[1]为0:指定的条件为假时转移BO[2]为1:执行bc指令时,CTR寄存器保持不变BI[0-2]的值为0:指出CR寄存器中的CR0中的状态作为指令跳转条件BI[3-4]的值为10:使用EQ(等于)状态作为指令的转移条件综上,该指令的意思是说只有比较结果不等于0,就转移可以使用指令助记符:bne BD 来代表bc 4,2,BD。

备注:目标地址是相对地址,还是绝对地址要看AA标识是否置位。

常用的指令助记符lt(小于), le(小于等于),eq (等于),so(溢出),+(转移被静态预测为真,选择转移),-(转移被静态预测为假,不选择转移)等等。

在Powerpc指令集中常用的条件转移指令只有bc,bcl,以前的转移指令beq,ndnz,ble等等都是助记符。

2.3 SC-Form指令该指令主要用来实现系统调用,只有“sc”这一条汇编,比较简单2.4 D-Form指令该指令一定包含一个立即数。

指令格式如下:0-5 5-10 11-15 16-31OPCD RS/RT RA DRS/RT:存放该条指令运算结果的寄存器的索引RA:存放源数据的寄存器索引D:存放该指令需要的另一个立即数数据源该指令格式包含两类:1.对存储器或者寄存器进行读写的指令2.立即数的算术运算和逻辑运算指令典型指令如下:2.4.1 Load Word and Zero指令lwz RT, D(RA)语义:if RA=0 then b=0else b=(RA)EA=b+extsign(D)RT=32个连续的0 连上MEM(EA,4)解释:extsign(D):表示D符合扩展到32bit(因为D 是16 bit,参与运算的是32bit)MEM(EA,4):表示从EA地址处取得32位数据该指令的目的就是将RA+D指定的地址中读取一个32位的数据,然后将此数据传递给RT寄存器。

此外还有对16 bit 和8 bit进行操作的lhz,lbz 指令2.4.2 STore Word指令stw RS, D(RA)和lwz指令想反,将寄存器RS中的32位数存到RA+D指向的内存单元处备注:立即数D参与的寻找计算,都需要将D符号扩展至32位。

2.4.3 Load Word and Zero with Update指令lwzu RT,D(RA)解释:将D+RA指向的内存单元的值放入RT索引的寄存器,然后将RA寄存器的值更新为RA+D2.4.5 Store Word with Update指令stwu RS,D(RA)同lwzu相反。

备注:这两条指令可以实现数据栈的压栈和出栈操作,另外还有对8位和16位数据进行操作的指令lbzu,stbu和sthu,lhzu指令,格式通上。

2.4.6 介绍两条批处理指令Load Multiple Word指令:lmw RT,D(RA)语义:if RA = 0 then b <- 0else b <-(RA)EA <-b + EXTS(D)r <-RTdo while r ≤ 31GPR(r) <- 32个连续0 || MEM(EA, 4) //||表示字符串的连接,例如a||b就是abr <- r + 1EA <- EA + 4endwhile解释:将RA+D地址处的数据依次传递到RT至31中,传递的32位数据量32-RT个Store Multiple Word指令stmw RS,D(RA)解释:将RS至R31的(32-RS)个数据依次传递到RA+D指向的内容地址处。

备注:使用这两个寄存器时要注意存储器的边界检查和所使用到的通用寄存器是否需要备份。

2.4.7 Compare Immediate指令cmpi BF,L,RA,SI语义:n <- BF表示的数值if L = 0 then a <- EXTS((RA)32:63)else a <- (RA)if a < EXTS(SI) then c <-0b100 //小于时设置CRn(0)为1else if a > EXTS(SI) then c <- 0b010 //大于时设置CRn(1)为1else c <- 0b001 //等于时设置CRn(2)为1CR寄存器中的: 4×BF+32:4×BF+35 <- c || XER寄存器中SO位// ||表示字符连接解释:将寄存器RA与立即数SI进行比较,然后将比较指令产生的状态放入CR寄存器的不同字段中,CR寄存器有8个CRn字段(n从0至7),可以由三bit位的BF段指定。

L:表示是进行32位还是64的比较。

对于e600而言,只有L=0的比较。

备注:解释一下CR寄存器,e600中32位CR寄存器用来存放指令执行之后的状态,该寄存器分为8个字段。

分别为CR0,CR1,…,CR7。

每个字段都由4bit组成。

各个字段CRn(n从0至7)都可以表示响应指令执行的结果:比如整数的加减及逻辑运算,使用CR0来存放状态,CR0的四个bit位的含义如下:CR0(0):用来表示LT(小于),当整型指令运算结果为负时置1;CR0(1):用来表示GT(大于),当整型指令运算结果为正时置1;CR0(2):用来表示EQ(等于),当整型指令运算结果为0时置1;CR0(3):用来表示SO(溢出),当整型指令运算结果溢出时置1;同理浮点数的运算使用CR1来保存运算状态,保存过程同上,e600的比较指令可以使用CR寄存器的全部的CRn(n从0至7)来保存运算的结果。

相关文档
最新文档