在了解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两个指令并不完全等同于mov al,[ebx]和mov ax,[ebx+10]这两个,因为前面两个是将字节和半字加载到r3时还清空了高位,而后两条指令只是加载数据到eax,并不会清空高位。

另外,还有两个指令sthbrw和stwbrx,对PowerPC存取小端格式数据很有用,它们允许存取这样的数据,若数据以小端顺序进入总线,就把它存为大端顺序。

好了,现在来详细看下赋值指令,下面是最常见的赋值代码:

lis    r3,0x1234

addi r3,r3,0x5678

这段代码的含义是将0x12345678加载到寄存器r3中。因为在RISC下,PowerPC的每条指令都是32bit,除去指令和寄存器参数编码,只剩下16bit的长度描述立即数,如立即数加载指令li:

这样立即数SIMM只有16位,所以需要两次加载,使用lis(立即数载入并左移)和addi(立即数加法)两条指令完成。

再看下PowerPC不同的子程序调用:

func:/* 子程序入口 */

blr     /* 返回(跳转到lr地址) */

start:

bl func   /* 调用func(跳转并保存地址到lr) */

li r1,1   /* 设置r1、r3 */

li r3,1

sc        /* 系统调用,结束程序 */

这里的调用由PowerPC使用lr寄存器完成,在bl指令跳转前,下一条指令li r1,1的地址会被保存在lr,而执行的func中的blr时,系统会跳到lr表示的地址,完成返回。

再来介绍下特殊寄存器的操作指令,它们可以完成特殊用途寄存器之间和通用寄存器之间的数据交换,不可以直接对特殊用途寄存器中的值进行处理,但是,可以将一个值先拷贝到一个通用寄存器上处理,再将信息存到特殊用途寄存器上。下面是指令集合:

这里回顾下,PowerPC里没有堆栈,那用什么实现模拟呢?看下面的例子:

f1:

mflr r2   /*保存lr中记录的地址到r2*/

stw r2,-8(r1)  /*记录r2的值到mem[r1-8]*/

addi r1,r1,-60   /*r1后移60个字节,完成进栈操作*/

...

addi r1,r1,60   /*r1前移60个字节,准备出栈*/

lwz r2,-8(r1)   /*读出老的lr值到r2*/

mtfr r2       /*将r2的内容复制到lr*/

blr       /*返回(跳转到lr地址)*/

start:

...

bl f1       /*调用f1(跳转并保持地址到lr)*/

看到了吧,虽然没有提供栈的相关指令(PUSH/POP/CALL/RET),但应用程序可以用r1模拟栈指针,实现多层调用对LR的记录和恢复。

前面说了,PowerPC指令为32位长,指令内仅有16位用于加载常量值,由于地址最多可达到64位,所以我们可以采用每次一段的方式载入地址,汇编程

序中的@符号指示汇编程序给出一个符号值的特殊处理形式:@highest:表示一个常量的第48-63位;@higher:表示一个常量的第32-48

位;@h:16-31位;@l:0-15位。

下面是我们的一个稍大点的PowerPC汇编程序总结下上面的指令集,实现的功能就是载入两个值并相加,最后退出,以结果为状态代码输出。代码如下:

#sum.s,第一个PowerPC汇编程序

.data

.align 3

#此处装载两个值

first_value:

.quad 1

second_value:

.quad 2

#写”.opd”(official procedure descriptor)

.section “.opd”,”aw”

.align 3

#._start的程序描述符,即为程序名

.global _start

_start:

.quad .start, .TOC.@tocbase,0

#._text为程序代码段

.text

._start:

#装载地址高位

lis r7,first_value@highest

ori r7,r7,first_value@higher

#shift these up to the high-order bits

rldier r7,r7,32,31

#装载地址低位

oris r7,r7,first_value@h

ori r7,r7,first_value@l

#将第一个值载入寄存器4

ld r4,0(r7)

lis r7,second_value@highest

ori r7,r7,second_value@higher

rldicr r7,r7,32,31

oris r7,r7,second_value@h

ori r7,r7,second_value@l

ld r5,0(r7)

#二者相加并存到寄存器6

add r6,r4,r5

#程序退出

li 0,1 #寄存器0为系统调用

mr r3,r6 #将结果移到寄存器3中

sc #对内核进行系统调用

power指令集 mysql_PowerPC汇编指令集简析相关推荐

  1. gbip指令集_ARM汇编指令集

    ARM处理器的指令集可以分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.加载/存储指令.协处理器指令和异常产生指令6大指令. 一.跳转指令 跳转指令用于实现程序流程的跳转,在ARM程序中 ...

  2. x86汇编指令集大全

    一.数据传输指令 1. 通用数据传送指令 MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX ...

  3. 【汇编语言与计算机系统结构笔记18】MIPS指令集与汇编程序设计 异常处理

    本次笔记内容: 28.MIPS指令集与汇编程序设计-2 补充:MIPS32异常处理 注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库. 本节课对应幻灯片:汇编语言程式设计-MIPS.pd ...

  4. 使用MMX/SSE汇编指令集优化视频开发

    1.汇编指令集 目前大部分的PC机采用的都是Intel或者AMD的CPU,其支持的多媒体汇编指令有: MMX:多媒体扩展指令(MultiMedia eXtention),该指令由Intel在1996年 ...

  5. ARM体系结构2:处理器内核和汇编指令集

    处理器内核 ARM7TDMI外部接口图: 指令流水线 为了增加处理器指令流的处理速度,ARM7系列采用了三级流水线,允许多个操作同时进行(一个执行的同时,另一个进行译码,另一个进行取址来提高效率),而 ...

  6. stm32 cortex M3 汇编指令集 英文详解

    这是cortex M3的汇编指令集详解,包含指令执行的周期,如下图示例,可以去Arm公司下载此文档,链接在此https://developer.arm.com/documentation/ddi033 ...

  7. 第七章 ARM 反汇编基础(七)(AArch64 汇编指令集)

    文章目录 AArch64 汇编指令集 AArch64 指令编码 AArch64 指令格式解析 AArch64 汇编指令集 arm64-v8a 对应两套架构的指令集 AArch32(简称"A3 ...

  8. ARM指令集与Thumb指令集--区别关联--汇编指令 BX LR ; 跳转回LR地址处,既可以是ARM模式也可以是Thumb模式

    BX        LR    ; 跳转回LR地址处,既可以是ARM模式也可以是Thumb模式 A 一.现在先区分下ARM指令集与Thumb指令集        Thumb 指令可以看作是 ARM 指 ...

  9. SIMD补充 指令集架构类型 指令集介绍

    文章目录 SIMD 指令集架构类型 CISC的产生.发展和现状 RISC的产生.发展和现状 IA-64(EPIC)产生.发展和现状 RISC与 IA-64(EPIC)相比 指令集介绍 一.X86 二. ...

最新文章

  1. JMM和底层实现原理
  2. leetcode-728-Self Dividing Numbers
  3. 二分查找非递归方式实现
  4. 2021安徽省计算机应用基础,安徽省高等教育自学考试2021年4月课程考试时间安排表.pdf...
  5. 在微型计算机系统中 下列叙述正确的是,全国2011年10月高等教育自学考试计算机应用基础试题及答案...
  6. 搭建测试环境_当面试时被问到“搭建过测试环境吗”, 身为小白要怎么回答?...
  7. FFmpeg Android 学习(一):Android 如何调用 FFMPEG 编辑音视频
  8. jQuery阻止表单提交
  9. 拓端tecdat|R语言小数定律的保险业应用:泊松分布模拟索赔次数
  10. 阿里云CentOs 6.4 yum报错Couldn't resolve host'xx
  11. 台达AS228Tplc加台达触摸屏一套程序,一共100个io 左右,一个伺服程序。plc程序有FB块,ST语言,C语言,触摸屏有配方和数据储存功能
  12. 织梦php 文章采集规则,织梦DedeCms采集有什么规则?织梦DedeCms采集规则图文教程_好特教程...
  13. 机器学习教程之语义分割入门教程
  14. 系统漏洞解析含flag
  15. 2021年CCPC网络预选赛重赛补题
  16. go install报错no install location for directory outside GOPATH
  17. Android蓝牙音乐获取歌曲信息
  18. 第6.3章:ARM架构下手动编译StarRocks(拓展篇)
  19. linux备份压缩tgz,linux关于解压和压缩命令 zip rar tar.gz tgz
  20. 高质量的外链怎么去挖掘?

热门文章

  1. nuget在jenkins上不能自动还原项目依赖包---笔记
  2. 对Linux系统中的时钟和时间的探讨
  3. Linux下JNI实现
  4. Struts2 method=get方法乱码
  5. java 使用 idea 调试 ysoserial
  6. python3 pycharm 远程调试 启动报错 ValueError: source code string cannot contain null bytes
  7. centos7 利用 crontab 执行 定时任务 计划任务
  8. java 日志输出 log4j 简介
  9. git clone 几种可选参数的使用与区别
  10. python3 request模块 post请求四种方式