分类:
2009-05-14 13:24:33
转移指令
表4 分支控制指令
名称 |
助记符 |
语法格式 |
无条件转移 |
b( ba bl bla) |
target_addr |
条件转移 |
bc( bca bcl bcla) |
BO,BI,target_addr |
条件转移(转移目标地址由LR指出) |
bclr(bclrl) |
BO,BI |
条件转移(转移目标地址由CTR指出) |
bcctr(bcctrl) |
BO,BI |
(1) 无条件转移指令bx(b ba bl bla)
指令的编码格式:
指令的语法格式:
b target_addr(AA=0 LK=0)
ba target_addr(AA=1 LK=0)
bl target_addr(AA=0 LK=1)
bla target_addr(AA=1 LK=1)
如果AA=0,则转移目标地址为LI||0b00的值经符号位扩展后加上指令地址。
如果AA=1,则转移目标地址为LI||0b00的值经符号扩展后的值。
如果LK=1,则转移指令下一条指令的有效地址存放到连接寄存器。
(1) 条件转移指令bcx 指令编码格式: 指令语法格式: bc BO, BI, target_addr(AA=0 LK=0) bca BO, BI, target_addr(AA=1 LK=0) bcl BO, BI, target_addr(AA=0 LK=1) bcla BO, BI, target_addr(AA=1 LK=1) BI字段表示条件寄存器CR中的位用于转移条件。BO字段操作码定义见表5。 表5 BO字段操作码定义
BO 说明 0000y 计数器CTR减量,如果条件不成立则转移 0001y 计数器CTR减量,如果条件不成立则转移 001zy 如果条件不成立,则转移 0100y 计数器CTR减量,如果条件成立则转移 0101y 计数器CTR减量,如果条件成立则转移 011zy 如果条件成立则转移 1z00y 计数器CTR减量,如果CTR!=0,则发生转移 1z01y 计数器CTR减量,如果CTR=0,则发生转移 1z1zz 发生转移
注:位z表示该位可以被忽略,位y表示是不是条件转移
(2) 条件转移指令bclx(转移目标地址由LR指出)
指令的编码格式:
指令的语法格式:
bclr BO, BI(LK=0)
bclrl BO, BI(LK=1)
BI字段表示条件寄存器CR中的位用于转移条件。
BO字段操作码定义如表5所示。
转移目标地址为LR[0-29]||0b00。
如果LK=1,则转移指令下一条有效地址存放到连接寄存器。
(3) 条件转移指令bcctrx(转移目标地址由CTR指出)
指令的编码格式:
指令的语法格式:
bcctr BO, BI(LK=0)
bcctrl BO, BI(LK=1)
转移目标地址是CTR||0b00。
如果LK=1,则转移指令下一条指令的有效地址存放到连接寄存器。
如果减量计数器(BO[2]=0),指令格式无效,则转移到目标地址。
特殊寄存器传送指令 特殊寄存器传送指令如表6所示。 表6 特殊寄存器传送指令
名称 助记符 语法格式 读取机器状态寄存器 mfmsr rD 写入机器状态寄存器 mtmsr rS 读取特殊功能寄存器 mfspr rD, SPR 写入特殊功能寄存器 mtspr SPR, rS 读取段寄存器 mfsr rD, SR 写入段寄存器 mtsr SR, rS 间接读取段寄存器 mfsrin rD, rB 间接写入段寄存器 mtsrin rS, rB 读取时基寄存器 mftb rD, TBR
(1) 读取机器状态寄存器指令mfmsr
指令的编码格式:
指令的语法格式:
mfmsr rD
读取MSR的内容放入rD中,这是超级用户层指令,不影响其他寄存器。
(2)写入机器状态寄存器指令mtmsr
指令的编码格式:
指令的语法格式:
mtmsr rS
把rS的内容存入MSR中,这是超级用户指令。
(1) 读取特殊功能寄存器指令mfspr 指令的编码格式: 指令的语法格式: mfspr rD,SPR 指令操作: n<—spr[5-9]||spr[0-4] rD<—spr(n) 特殊功能寄存器(SPR)的编码如表7所示,将SPR的内容存入rD中。 表7 Power PC UISA SPR编码
spr 寄存器名 编码n spr[5-9] spr[0-4] 1 00000 00001 XER 8 00000 01000 LR 9 00000 01001 CR
(2) 写入特殊功能寄存器指令mtspr
指令的编码格式:
指令的语法格式:
mtspr spr,rS
把rS的内容存入到指定的特殊功能寄存器中。
(3) 读取段寄存器指令mfsr
指令的编码格式:
指令的语法格式:
mfsr rD,SR
指令操作:
rD<—SEGREG(SR)
将段寄存器SR的内容读入rD中,这是一个超级用户层指令。
(1) 写入段寄存器指令mtsr 指令的编码格式: 指令的语法格式: mtsr SR,rS 将rS中的内容读入SR,这是一个超级用户层指令。 (2) 间接读取段寄存器指令mfsrin 指令的编码格式: 指令的语法格式: mfsrin rD,rB 指令操作: rD<—SEGREG(rB[0-3]) 由rB寄存器的0~3位选取的段寄存器的内容,复制到rDzhong。这是一个超级用户层指令。 (3) 间接写入段寄存器指令mtsrin 指令的编码格式: 指令的语法格式: mtsrin rS,rB 指令操作: SEGREG(rB[0-3])<—(rS) 将rS中的内容复制到由rB的0~3位所指定的寄存器中。这是一个超级用户层指令。 (4) 读取时基寄存器指令mftb 指令的编码格式: 指令的语法格式: mftb rD,TBR 指令操作: n<—tbr[5-9]||tbr[0-4] if n=268 then rD<—TBL else if n=269 then rD<—TBU 该指令的TBR编码如表8所示。 表8 指令mftb的TBR编码
TBR 寄存器名 访问 编码 tbr[5-9] tbr[0-4] 268 01000 01100 TBL 用户 269 01000 01101 TBR 用户
系统调用指令
(1) 系统调用指令sc
指令的编码格式:
指令的使用:
sc指令调用操作系统去执行服务程序。当控制返回到一个执行系统调用的程序时,寄存器的内容依赖于程序提供的系统所使用的寄存器的约定。
跟在sc指令后面的有效指令地址被放在SRR0中。MSR中的位0、5~9和16~31被放在SRR1中对应的位置,SRR1中位1~4和10~15被设置为未定义值。当sc异常产生,异常处理程序更改MSR寄存器。异常处理程序到MSR[IP]形成基址加0xC00偏移量形成的地址去取下一条指令。
受影响的寄存器有:
依赖于系统服务、SRR0、SRR1及MSR。
(2) 中断返回指令rfi
指令的编码格式:
指令操作:
MSR[16-23,25-27,30-31] <—SRR1[16-23,25-27,30-31]
NIA<—iea SRR0[0-29]||0b00
SRR1中的位0、5~9和16~31被放在MSR中对应的位置。如果新的MSR值没有使能任何未完的操作,则在MSR的控制下,从地址SRR0[0-29]||0b00取下一条指令。
指令的使用中受影响的寄存器为MSR。