首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

PPC入门与优化杂谈(3)

PPC入门与优化杂谈(3)

本帖最后由 look_w 于 2017-10-24 15:48 编辑

条件转移原理(了解)BC BO, BI, target_addr (AA=0, LK=0)
    m <- 32
    If BO[2]=0 then CTR <- CTR – 1                   如果BO[2]==0则计数器自减
    ctr_ok <- BO[2] | BO[3]                               判断计数器条件
    cond_ok <- BO[0] | (CR[BI] == BO[1])         判断条件寄存器某位是否符合需求
    If ctr_ok & cond_ok then                             如果两个条件同时成立则执行跳转
        if AA then NIA <- iea EXTS(BD || 0b00)    如果使用绝对地址
        else NIA <- iea CIA + EXTS(BD || 0b00)   如果使用相对地址
        if LK then LR <- iea CIA + 4                     判断是否记录指令地址到LR
注:NIA - 新指令地址;CIA - 当前指令地址;EXTS - 扩展正负符号;AA - 是否使用绝对跳转的标志;LK - 是否用LR保存下条指令地址(CIA + 4)。
BO字段常用操作码:
BO=00100 如果条件成立(CR[BI]==0)则发生跳转
BO=01100 如果条件不成立(CR[BI]==1)则发生跳转
BO=10100 直接跳转
问题4:求绝对值指令原理
下面代码请直接用CMP/ BC两条指令实现(提示:参考前面关于BC/CMP两条指令原理)
cmpw r3, r4
beq _branch_1
答案(了解即可):
cmp 0, 0, r3, r4
bc 0b01100, 2, _branch_1
其实在实际开发中都是直接书写替代的别名
问题5:PowerPC与x86的编码区别
PPC指令系统比x86/arm晦涩,同时RISC载入常数等指令等要分两次;PPC大部分指令都是三操作数,而x86几乎都是双操作数;PPC指令比x86更细致精准,同样程序PPC代码要比x86短。

示例:演示递归 – 求阶乘接下来的程序将通过求阶乘演示递归。之前曾经说过:PPC没有栈,故而实际递归时需要保存现场与返回地址的工作交给了应用程序,我们一般使用R1来模拟栈指针:
• _factoria:                             /* 求阶乘,输入R3,返回R3 */
•     mflr %r2
•     stw %r2, -8(%r1)
•     addi %r1, %r1, –60
• _factoria.start:
•     cmpwi %cr0, %r3, 1
•     bgt _factoria.n1               /* branch to n1 if r3 > 1 */
•     li %r3, 1                         /* return 1 (if r3 <= 1) */
•     b _factoria.exit
• _factoria.n1:
•     stw %r3, 8(%r1)              /* save r3 to stack */
•     addi %r3, %r3, –1           /* r3 = r3 - 1 */
•     bl _factoria                     /* call _factoria */
•     lwz %r11, 8(%r1)            /* r11 = [r1 + 8] (old r3) */
•     mullw %r3, %r3, %r11    /* r3 = r3 * r11 */
• _factoria.exit:
•     addi %r1, %r1, 60           /* restore stack point */
•     lwz %r2, -8(%r1)             /* resotre LR */
•     mtlr %r2
•     blr
根据操作系统的不同,规定了不同的ABI(应用程序二进制接口),详细定义了栈如何操作,参数如何传递等关键接口规范,开发时需注意查看。
PowerPC 编译调试
交叉编译(在一个平台下编译另一个平台运行的程序)需要一台Unix机器或者Cygwin,下载并重新编译binutils即可:

# tar -jvxf binutils-2.18.tar.bz2
# cd binutils-2.18
# ./configure --target=powerpc-linux-eabi
# make all install
模拟器QEMU最好在Linux环境中使用(才能支持用户模式模拟)
# apt-get install qemu (debian直接安装)
其他平台需要手工编译。所谓用户模式在于不需要模拟整个PPC操作系统,而是模拟执行PPC-Linux下二进制可执行文件,PPC程序的系统调用将会转化为本机 Linux的系统调用。所以我们不需要再在QEMU下重新安装一个 Mac OS X之类的系统:
# powerpc-linux-eabi-as -gstabs hello.s -o hello.o
# powerpc-linux-eabi-ld hello.o -o hello
# qemu-ppc ./hello
Hello, PowerPC World !!
#
上面是使用第一章中的 hello.s进行编译,并在虚拟机中运行以后的效果。
返回列表