PowerPC VxWorks BSP分析(2)--PowerPC汇编-阿里云开发者社区

开发者社区> 云计算> 正文
登录阅读全文

PowerPC VxWorks BSP分析(2)--PowerPC汇编

简介:



1          PowerPC汇编

这里总结PPC指令集中几种常用的指令。
首先为运算和逻辑指令,它与通用寄存器有关,源数据来自GPR16位立即数,目的是GPR寄存器,操作为32位,GPR中存放32位更新数据,大多数都可以望文生义,注意在最后列的“cntlzw”指令“计算字中的第一个0,在一个字中找到1时将一个指令中的0的数量找出,它在决定例外寄存器中最高优先服务时有用,我们将在例外处理那章讨论。
下面为装入存储指令,它们对数据在存储器中和通用寄存器中传送非常有用,如果数据小于一个字,为半个字或一个字节。指令总是使数据变位32位,将不同位填0或符号扩展。
lbz”为“存0入字节”。
lha”为“存半字”,意思为将符号扩展到一个字。
lhz”为“存半字扩展”。
下一个为“lwz”指令,它为“存字扩展0它为PPC64位结构中使用准备,但在32位结构中也可以使用。这个缩写不变。
还有“store byte”指令,“store half word”和"store word"
下面我们看到"load multiple word" , "store multiple word" , "load string word" "store string word" 
另外,还有2个指令结尾位“brx" - "sthbrx"   "stwbrx"   PPC    ENDIAN 格式数据非常有用,有可能是PowerPC与其他使用小ENDIAN格式数据的处理机共用存储器,为使PowerPC可以存取这样的数据,这些指令允许存取这样的数据。如果数据以小ENDIAN顺序进入总线,就把它存为大ENDIAN顺序。
下面介绍支持指令流控制的几个指令,它包括转移指令.这里我们看到转移指令,条件转移指令,它们利用条件寄存器的位来决定是否转移,在指令的右边说明了条件寄存器,它分为44位域,在每一域中的位代表小于、大于、等于和总和溢出,这个寄存器提供了8种支持条件转移指令的条件域。
同样还有转移到计数器的指令,SPR9用在用户态编程模式中
特殊用途寄存器8可以完成基于接连寄存器的转移指令,SPR8存储着转向子程序的地址。
还有自陷指令,一个系统调用指令,“rfi”用于例外服务程序,还有许多影响条件寄存器的指令。
下面,我们看到处理机控制指令的表,一个非常重要的因素是这些指令可以完成特殊用途寄存器之间和通用寄存器之间的数据交换,不可以直接对特殊用途寄存器中的值进行处理,但是,可以将一个值先拷贝到一个通用寄存器上再处理,操作后,将信息存到特殊用途寄存器上。
“特殊寄存器移出”指令将特殊寄存器中的数据移到通用寄存器上,“移入特殊寄存器”指令将通用寄存器上的数据移到特殊寄存器上。
举例说,如果用户要初始化计数寄存器,就要将数据装入通用寄存器,这里“装入立即数”指令装入R13和计数寄存器,然后,移入特殊寄存器指令将R13中的值装入计数寄存器。
比较指令可以影响任何条件寄存器域。
基本的比较指令语法为缩写cmp后面进跟着4个域。
第一域说明CR0CR7中哪一個受影响,第2域指出长度,有2种长度选择,32位或64位,MPC860中只有32位。第三和第四域指出將會比较的寄存器rArB
第二种比较的格式为“cmpl”比较逻辑,第三种为“cmpi”立即比较,第四种为“cmpli 是立即比较逻辑;
比较功能也可以用简化的缩写完成,第一个例子是“cmpw r13, r14,等于“cmp cr0,0,r13,r14”,表中下面的例子说明可以在操作数中包括cr5,它是用来指定cr5而不是cr0
在下面还有2个举例,有2个寄存器,r10包括16进制的7千万,r11包含16进制的8千万,第一个例子比较r10r11并把值存入cr5中的条件位,在这里cmpw是一个符号比较,即r11r10中的值有符号值。16进制,7千万是一个大正数,16进制8千万是一个负数,这样r10r11大所以大于位设置,而“小于”位和“等于”位为0
下一个指令相似但为逻辑,在这里,参数作为无符号数处理,这样,16进制8千万大于16进制7千万,所以1110大,这样小于位设置,而“大于”位和“等于”位为0
这里我们学习使用XER寄存器的多精度运算,XER包含3个位:总和溢出、溢出和进位。
编程者需要指出使用或修改XER的那位,可以利用后缀的“C”“E”和/或“O”。“C”在CA中记录进位,“E”利用CA作为指令中的操作数在CA中记录进位。最后,“O”在溢出和总和溢出中记录溢出。
作为例子,一个简单的“add”指令不使用XER,“addc”在CA中记录进位,“adde”利用CA作为操作数并将进位记入CA,“addo”在OV中记录溢出,“addco”在OV中记录溢出,CA中记录进位。


 本文转自 21cnbao 51CTO博客,原文链接:http://blog.51cto.com/21cnbao/133621,如需转载请自行联系原作者



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: