1、MIPS汇编汇编语言指令格式:标签:标签:操作符操作符 操作数操作数#注释注释 标签:可选标签:可选标记内存地址,必须跟冒号标记内存地址,必须跟冒号通常在数据和代码段出现通常在数据和代码段出现操作符:操作符:定义操作(如定义操作(如addadd,subsub等)等)操作数:操作数:指明操作需要的数据指明操作需要的数据可以是寄存器、内存变量或常数可以是寄存器、内存变量或常数大多数指令有大多数指令有3 3个操作数个操作数L1L1:addiu$t0,$t0,1 addiu$t0,$t0,1 MIPS汇编程序框架.data伪指令定义程序的数据段,程序的变量需要在该伪指令定义程序的数据段,程序的变量需要
2、在该伪指令下定义,汇编程序会分配和初始化变量的存储空间下定义,汇编程序会分配和初始化变量的存储空间.text伪指令定义程序的代码段定义程序的代码段.global伪指令声明一个符号位全局的,全局符号可以被其他的声明一个符号位全局的,全局符号可以被其他的文件引用,用该伪指令声明一个程序的文件引用,用该伪指令声明一个程序的mainmain过程过程寻址直接寻址直接寻址la$t0,var1la$t0,var1把把var1var1在主存中的地址拷贝到寄存器在主存中的地址拷贝到寄存器t0t0。var1var1可以是标签可以是标签地址地址间接寻址间接寻址lw$t2,($t0)lw$t2,($t0)把把t0t0
3、存放的地址处的字拷贝到存放的地址处的字拷贝到t2t2中中sw$t2,($t0)sw$t2,($t0)把把t2t2中的字存储到中的字存储到t0t0中地址所指向的主存位置中地址所指向的主存位置基址寻址基址寻址lw$t2,4($t0)lw$t2,4($t0)把把t0t0中地址加中地址加4 4所得的地址所对应的主存中的字载入寄存所得的地址所对应的主存中的字载入寄存器器t2t2中,中,4 4为偏移量为偏移量数据定义 名字名字:伪指令伪指令 初始值初始值,初始值,初始值.数据定义的例子:跳转(绝对地址)指令:JAL(Iump-and-Link)JAL(Iump-and-Link):调用指令:调用指令jal
4、 labeljal label#$31=PC+8,jump#$31=PC+8,jump在在$ra=PC+8$ra=PC+8中保存返回地址并跳转到相应的过程中保存返回地址并跳转到相应的过程JR(Jump Register)JR(Jump Register):返回指令:返回指令l ljr Rs#PC=Rsjr Rs#PC=Rs,将控制转移到任意地址,将控制转移到任意地址l l跳转到在寄存器跳转到在寄存器Rs(PC=Rs)Rs(PC=Rs)中存储的地址所在中存储的地址所在指令指令l lj label#j label#只能到达只能到达228228个字节的页内指令个字节的页内指令l l目标地址的高目标地
5、址的高4 4位是当前位是当前PCPC的高的高4 4位值位值 JALR(Jump-and-Link Register)JALR(Jump-and-Link Register)jalr Rd,Rs#Rd=PC+8,PC=Rsjalr Rd,Rs#Rd=PC+8,PC=Rs在在Rd=PC+8Rd=PC+8中存储返回地址,跳转到寄存器中存储返回地址,跳转到寄存器Rs(PC=Rs)Rs(PC=Rs)中存储的地址所在过程,地址仅在运行时可知中存储的地址所在过程,地址仅在运行时可知分支(PC相对寻址)指令:PC+labelb b labellabelgoto labelgoto labelbeq beq s
6、,t,labels,t,label if(sif(s=t)goto=t)goto labellabelbeql beql s,t,labels,t,label if(sif(s=t)goto label)beq=t)goto label)beq可能分支变体,仅当分支放可能分支变体,仅当分支放生时才执行延迟槽指令生时才执行延迟槽指令beqz beqz s,labels,label if(sif(s=0)goto=0)goto labellabel,可能,可能分支分支变体变体beqzlbeqzlbgez bgez s,labels,label if(sif(s=0)goto=0)goto labe
7、llabelbgtz bgtz s,labels,labelif(s0)goto labelif(s0)goto labelbne bne s,t,labels,t,label if(sif(s!=t)goto!=t)goto labellabel,可能可能分支分支变体变体bnelbnelbnez bnez s,labels,label if(sif(s!=0)goto!=0)goto labellabel,可能,可能分支分支变体变体bnezlbnezlblez s,labelblez s,labelif(s=0)goto label)if(s=0)goto label),可能分支变体,可能分
8、支变体blezlblezlbltz s,labelbltz s,labelif(s0)goto if(s0)goto labellabel),可能分支变体可能分支变体bltzlbltzl存储器访问lw t,addr lw t,addr t=*(int*)addr)t=*(int*)addr),3232位加载,位加载,6464位位CPUCPU上符号扩展上符号扩展lwl lwl t,addrt,addr 向左向左加载一个字,非对齐加载一个字,非对齐加载加载lwr lwr t,addrt,addr 向右向右加载一个加载一个字字lh lh d,addrd,addr1616位加载,符号扩展到整个寄存器,
9、位加载,符号扩展到整个寄存器,d=*(signed short d=*(signed short*)addr*)addr)lhu lhu d,addrd,addr1616位加载,零扩展到整个寄存器,位加载,零扩展到整个寄存器,d=*(unsigned short d=*(unsigned short*)addr*)addr)lbu lbu d,addrd,addr8 8位加载,零扩展到整个寄存器,位加载,零扩展到整个寄存器,d d=*(unsigned=*(unsigned char char*)addr*)addr)lb lb d,addrd,addr8 8位加载,符号扩展到整个寄存器,位加
10、载,符号扩展到整个寄存器,d=*(signed char d=*(signed char*)addr*)addr)lwc2 cd,lwc2 cd,addraddr3232位加载到协处理器位加载到协处理器2 2寄存器,如果实现了的话,寄存器,如果实现了的话,很很少见少见lwxc1 fd,t(blwxc1 fd,t(b)采用采用索引(寄存器索引(寄存器+寄存器)地址加载寄存器)地址加载3232位浮点,常写位浮点,常写为为l.sl.s,fd=*(float*(t+bfd=*(float*(t+b)li li d,jd,j将将常数常数j j的值放入到寄存器的值放入到寄存器d d中中lui lui t,
11、ut,u(Load Upper Immediat)(Load Upper Immediat)上位上位加载立即数(常数加载立即数(常数u u符号扩展符号扩展到到6464位寄存器),位寄存器),t=ut=u1616ldc1 ldc1 d,addrd,addr6464位加载协处理器位加载协处理器1 1(浮点)寄存器,常写成(浮点)寄存器,常写成l.dl.dldc2 ldc2 d,addrd,addr6464位加载协处理器位加载协处理器2 2寄存器,如果采用了协处理器寄存器,如果采用了协处理器2 2并且宽度为并且宽度为6464位的话位的话ll ll(load linkedload linked)和)和
12、scsc(store conditionalstore conditional)组成原子操)组成原子操作:作:ll d,off(b)sc ll d,off(b)sc t t,off(b),off(b)l ll l从内存读取一个字,以实现接下来的从内存读取一个字,以实现接下来的RMWRMW操作,操作,scsc向内向内存中写入一个字,以完成前面的存中写入一个字,以完成前面的RMWRMW操作。操作。“ll d,off(b)ll d,off(b)”指令指令执行后,处理器会记住执行后,处理器会记住ll ll操作,操作,“sc sc t t,off(b),off(b)”会检查上次会检查上次ll ll指令执
13、指令执行后的行后的RMWRMW操作是否是原子操作(不存在其他对这个地址的操操作是否是原子操作(不存在其他对这个地址的操作),若是,作),若是,t t的值会被更新到内存中,同时的值会被更新到内存中,同时t t的值变为的值变为1 1,表示操,表示操作成功;若不是,作成功;若不是,t t的值不会被更新到内存,同时的值不会被更新到内存,同时t t的值变为的值变为0 0,表,表示操作失败。示操作失败。sw sw t,addrt,addr*(int*)addr)=tint*)addr)=t,存储一个,存储一个字字sb sb t,addrt,addr*(char*)addr)=char*)addr)=t t
14、s sh t,addr h t,addr*(short*)addr)=t*(short*)addr)=tswc1 ft,addrswc1 ft,addr 存储存储单精度浮点数到单精度浮点数到内存内存swc2 swc2 ft,addrft,addr 存储存储协处理器协处理器2 2寄存器的寄存器的3232位位数据数据sdc1 sdc1 ft,addrft,addr存储存储双精度寄存器到存储器,常写成双精度寄存器到存储器,常写成s.ds.dsdc2 sdc2 cs,addrcs,addr 存储存储6464位协处理器位协处理器2 2寄存器到存储器寄存器到存储器算术及逻辑指令addu addu d,s,
15、td,s,td=s+td=s+taddiu addiu d,s,jd,s,jd=sd=s+(+(signed)jsigned)jsub sub d,s,td,s,td=s-td=s-t,溢出时自,溢出时自陷陷subu subu d,s,jd,s,jd=s-jd=s-j;addiu d,s,-jaddiu d,s,-jdiv d,s,tdiv d,s,t有有符号符号3232位除法指令,位除法指令,在被在被零除和溢出条件下发生零除和溢出条件下发生异常异常divu$divu$zero,s,tzero,s,tno no checkschecks,lo=s/tlo=s/t,hi=s%thi=s%tmul
16、t mult s,ts,thilohilo=(signed)s*(signed)t=(signed)s*(signed)tand d,s,tand d,s,td=s&td=s&tand d,s,jand d,s,j(andi d,s,jandi d,s,j),),d=s&(unsigned)jd=s&(unsigned)j,仅用于,仅用于0=j655350=j65535,对于更大的数要生成额外的,对于更大的数要生成额外的指令指令maddu d,s,tmaddu d,s,t3232位整数乘法累加,两个寄存器以全精度相乘并累位整数乘法累加,两个寄存器以全精度相乘并累加加hilo=hilo+(lon
17、g long)s*(long hilo=hilo+(long long)s*(long long)tlong)tor or d,s,td,s,td=s d=s|t tori ori d,s,jd,s,jd=sd=s|(unsigned)j|(unsigned)j,跟一个常数执行,跟一个常数执行“或或”操操作作ORORsllv sllv d,t,sd,t,sd=td=t(s%32(s%32)(shift left logic by variableshift left logic by variable)sll sll d,s,shfd,s,shfd=sd=sshfshf;sll d,t,ssl
18、l d,t,s,d=t(s%32d=tshf=(signed)sshf,shift-right arithmetic,shift-right arithmetic,算术右移算术右移,最高位填充,适用于最高位填充,适用于有符号有符号数,数,sra sra d,s,td,s,t,d=(signed)s(t%32d=(signed)s(t%32)srav d,s,tsrav d,s,tsra sra d,s,td,s,tsrl srl d,s,shfd,s,shf d d=(unsigned)s=(unsigned)sshf shf,shift-right,shift-right logical,l
19、ogical,逻辑右移,逻辑右移,类似类似C C的无符号量的移位的无符号量的移位srl srl d,s,td,s,td d=(unsigned)s(t%32)=(unsigned)s(t%32)srlv srlv d,s,td,s,tsrl d,s,tsrl d,s,tslt slt d,s,td,s,td=(signed)s(signed)t)?d=(signed)s(signed)t)?1:0 (set on less 1:0 (set on less than)than)sltu d,s,tsltu d,s,td=(unsigned)s(unsigned)t)?1:0d=(unsigne
20、d)s(unsigned)t)?1:0slti d,s,jslti d,s,jd=(signed)s(signed)j)?1:0d=(signed)s(signed)j)?1:0sltiu d,s,tsltiu d,s,td=(unsigned)s(unsigned)j)?1:0d=(unsigned)s(unsigned)j)?1:0break break codecode调试器调试器用的断点指令。用的断点指令。CodeCode值对硬件没有效果,值对硬件没有效果,但是断点异常例程可以通过读取异常但是断点异常例程可以通过读取异常原因原因指令检索到它的指令检索到它的值值cache cache k
21、,addrk,addr 对对高速缓存进行操作高速缓存进行操作-第四章会详细第四章会详细说明说明e ehbhb(执行遇险防护执行遇险防护-当你需要保证上面指令的任何协处理器当你需要保证上面指令的任何协处理器0 0的副作用在随后的的副作用在随后的指令执行指令执行之前已经完成的时候所用的指令之前已经完成的时候所用的指令)ext ext d,s,shf,szd,s,shf,sz 从从3232位寄存器提取位域。位寄存器提取位域。ShfShf是位域在是位域在s s中的移位到中的移位到第第0 0位所需要的位移量,位所需要的位移量,szsz是位域包含的位的个数。是位域包含的位的个数。mask=(2*sz-1)
22、shfmask=(2*sz-1)d=(s&mask)shfshfs ssnopsnop(超标量空操作,是个空操作,但是在同一个时钟周期超标量空操作,是个空操作,但是在同一个时钟周期CPUCPU不得发送其他指令,用于达到时序目地不得发送其他指令,用于达到时序目地)move d,smove d,sd=sd=smovt d,s,$movt d,s,$fccNfccNif if($fcc(N)($fcc(N)d=sd=s($fccN$fccN或或fcc(N)fcc(N)是是FCSRFCSR寄寄存器中的浮点条件位之一)存器中的浮点条件位之一)movf movf d,s,td,s,tif(t)d=sif(
23、t)d=smovz movz d,s,td,s,tif if(!(!t)d=st)d=smovn movn d,s,td,s,tif(t0)d=sif(t=(signed)t)exception(TRAP(signed)s=(signed)t)exception(TRAP)tge s,jtge s,jif if(signed)s=(signed)j)exception(TRAP(signed)s=(signed)j)exception(TRAP)tgeu tgeu s,ts,tif if(unsigned)s=(unsigned)t)(unsigned)s=(unsigned)t)except
24、ion(TRAP)exception(TRAP)tgeu s,jtgeu s,jif if(unsigned)s=(unsigned)j)(unsigned)s=(unsigned)j)exception(TRAPexception(TRAP)tne tne s,ts,tif(tif(t!=s)exception(TRAP!=s)exception(TRAP)tnei tnei s,js,jif(sif(s!=j)exception(TRAP!=j)exception(TRAP)tlt tlt s,ts,tif if(signed)s(signed)t)exception(TRAP(signe
25、d)s(signed)t)exception(TRAP)tlti tlti s,js,jif if(signed)s(signed)j)exception(TRAP(signed)s(signed)j)exception(TRAP)tltu tltu s,js,jif if(unsigned)s(unsigned)j)exception(TRAP(unsigned)s(unsigned)j)exception(TRAP)udi9 udi9 d,r,s,ucd,r,s,uc 在在为用户自定义指令保留的指令编码空间内构建指为用户自定义指令保留的指令编码空间内构建指令。这种指令可以采用三个通用寄存器
26、指令,还可以有用于用户令。这种指令可以采用三个通用寄存器指令,还可以有用于用户逻辑的逻辑的5 5位辅助操作码位辅助操作码ucucwaitwait(MIPS32(MIPS32指令,进入某种断电状态。通常通过中止执行直到指令,进入某种断电状态。通常通过中止执行直到检测到中断实现。检测到中断实现。WaitWait指令应当从空转循环中调用指令应当从空转循环中调用)溢出(有符号数)有符号数)两两个正数相加个正数相加,如果结果,如果结果为负数,就产生了溢出。为负数,就产生了溢出。两个负数相加,如果结果为正数,就产生了溢出。两个负数相加,如果结果为正数,就产生了溢出。换个角度来说换个角度来说:正数正数 -负
27、数负数 =负数,就产生了溢出。负数,就产生了溢出。负数负数 -正数正数 =正数,就产生了溢出。正数,就产生了溢出。无符号数会出错的地方:无符号数会出错的地方:1 1、两个数相加超出了数所能表示的大小,产生进位、两个数相加超出了数所能表示的大小,产生进位2 2、小整数减大整数,会借位、小整数减大整数,会借位对对CP0CP0的主要操作有以下的指令:的主要操作有以下的指令:mfhi/mflo mfhi/mflo rt rt(Move From Hi/LoMove From Hi/Lo)将)将CP0CP0的的hi/lohi/lo寄存器内容传寄存器内容传输到输到rtrt通用寄存器中;通用寄存器中;mth
28、i/mtlo rt mthi/mtlo rt 将将rtrt通用寄存器内容传输到通用寄存器内容传输到CP0CP0的的hi/lohi/lo寄存器中;寄存器中;当当MIPSMIPS体系结构演进到体系结构演进到MIPS IVMIPS IV的的6464位架构后,新增了两条指令位架构后,新增了两条指令dmfc0dmfc0和和dmtc0dmtc0,向,向CP0CP0的寄存器中读的寄存器中读/写一个写一个64bit64bit的数据的数据mtc0 t,cdmtc0 t,cd把把3232位数据从通用寄存器传到协处理器寄存器位数据从通用寄存器传到协处理器寄存器cdcd。mtc0mtc0访问访问CPUCPU控制寄存器
29、,控制寄存器,mtc1mtc1把整数单元数据放到浮点寄存器,把整数单元数据放到浮点寄存器,mtc2mtc2是是CPUCPU采用协处理器采用协处理器2 2指令的时候用。如果协处理器寄存器是指令的时候用。如果协处理器寄存器是6464位宽度,数据加载进低位,但是高位宽度,数据加载进低位,但是高3232位的状态没有位的状态没有定义定义mfc0 t,csmfc0 t,cs把把3232位数据从协处理器位数据从协处理器cscs传送到通用寄存器传送到通用寄存器t t,如,如果果cscs是是6464位宽度,则传送的是低位宽度,则传送的是低3232位,位,CPUCPU控制控制寄存器寄存器http:/ http:/