标题:
PPC入门与优化杂谈(3)
[打印本页]
作者:
look_w
时间:
2017-10-24 15:36
标题:
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进行编译,并在虚拟机中运行以后的效果。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0