PPC 汇编入门指南(2)

2019-08-31 19:22

无条件跳转主要有b(跳转到相对地址)\\ba(跳转到绝对地址)\\blr(跳转到连接寄存器)\\bctr(跳转到计数寄存器)4种;(注意,rfi、rfci、rfmci等异常返回指令也可以看做是特殊的无条件跳转。)

条件跳转指令分为两种:需要配合比较指令/算术指令/逻辑运算指令使用的beq(相等或者为0则跳转)/bne(不等或者非0则跳转)/blt(小于则跳转)/bgt(大于则跳转)/ble(小于等于则跳转)/bge(大于等于则跳转)/bnl(不小于则跳转)/bng(不小于则跳转)等和需要配合计数寄存器CTR使用的bdz(CTR递减到0则跳转)/bdnz(CTR没有递减到0则跳转)等。

此外条件跳转指令还可以增加后缀a表示跳转到绝对地址;所有跳转指令增加后缀l表示同时更新连接寄存器(LR),用于子程序调用。

? 配合条件跳转指令使用的比较指令主要是cmp(l)w(i),其中l表示逻辑比较既无符号数比较,w表示比较2个word,i表示寄存器内容跟立即数进行比较;

? 配合条件跳转指令使用的算术指令必须加上后缀“.”用以表示更新条件寄存器CR,主要有add(寄存器内容相加)/addi(寄存器内容跟立即数相加)/addis(立即数左移16位后跟寄存器内容相加)和subi(寄存器内容减去立即数)/subis(寄存器内容减去左移16位后的立即数)/subf(从RB(第三个参数)中减去RA(第二个参数)的内容放入RT(第一个参数));

? 配合条件跳转指令使用的逻辑指令也必须加上后缀“.”用以表示更新条件寄存器CR,主要包括and(i)(s)/or(i)(s)。

? CTR等专用寄存器必须通过专用命令mfspr rD,SPR和mtspr SPR,rS或者mfctr/mtctr/mflr/mtlr/mfspr/mtspr/mftbl/mftbu/mttbl/mttbu鞥助记符进行操作。此外,DCR寄存器必须通过mfdcr/mtdcr/mfdcrx/mtdcrx/mfdcrux/mtdcrux等进行操作。注意,后面4条DCR指令仅在Power ISA 2.05及更高版本支持。

5.强大的位操作指令

PowerPC有3条强大的位操作指令,几乎能实现你能想象的所有位操作。

a)rlwinm(.) rA,rS,SH,MB,ME 寄存器RS的内容循环左移立即数SH位,然后跟立即数MB和ME形成的MASK相与后放进RA

b)rlwnm(.) rA,rS,RB,MB,ME 类似于上一条指令,只是把左移的位数放到了寄存器RB中

c)rlwimi(.) rA,rS,SH,MB,ME 寄存器RS的内容循环左移立即数SH位,然后跟立即数MB和ME形成的MASK相与,再把RA的内容跟立即数MB和ME形成的MASK的补码相与,即清掉RA中MASK对应的位,最后把处理后的RS和RA的内容相或,放入RA中

注意:MASK形成的规则是,如果MB小于等于ME,则MB到ME之间的位全部置1,包括这两位,形成MASK;否则,MB到ME之间的位清0,其他位包括这两位置1,形成MASK。

下面给出几个例子:

a)从立即数0x12345678(RS)中抽取bit 20-23,并左移16位,从而得到0x06000000.

rlwinm rA, rS, 16, 4, 7

具体过程如下:0x12345678循环左移16位得到0x56781234,然后与MASK0x0f00 0000 (MASK[4,7])相与。

* 该指令可以用来抽取C语言代码或者寄存器中的位域。

b)清除立即数0x12345678(RS)的bit 28 - 31,并右移24位,从而得到0x0012 3456

rlwinm rA, rS, 24, 8, 31

具体过程如下:0x12345678循环左移24位得到0x78123456,然后与MASK0x00ff ffff (MASK[8,31])相与。

* 该指令可以进行除数或者乘数为2的倍数的乘法/除法操作。

c)清除立即数0x12345678(RS)的bit 6,从而得到0x10345678

rlwinm rA, rS, 0, 7, 5

具体过程如下:0x12345678循环左移0位,仍是0x56781234,然后与MASK0xfdff ffff (MASK[7,5])相与。

* 该指令可以用来清除C语言代码或者寄存器中的位域。

d)抽取0x87654321(RS)的bit 24-31,用以对立即数0x12345678(RA)的bit 8-15进行先清除后置位的操作,从而得到0x12215678.

rlwimi rA, rS, 16, 8, 15

具体过程如下:0x87654321(RS)循环左移16位得到0x43218765,然后与MASK0x00ff 0000 (MASK[8,15])相与得到0x0021 0000;再把0x12345678(RA)与MASK0x00ff 0000 (MASK[8,15])的补码0xff00 ffff相与,得到0x1200 5678; 最后0x0021 0000跟0x1200 5678相与,得到0x12215678。

* 该指令可以用来清除C语言代码或者寄存器中的某个位域,然后对该位域进行赋值的操作。

结语:

PowerPC位操作指令 如斯强大和美妙,可以说是PowerPC汇编中的神器,因此几乎出处可见他们的身影。谨以此作为PowerPC指令集架构的总结,希望能够引起大家对PPC汇编的兴趣。


PPC 汇编入门指南(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:GB 14881-2013试题答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: