MIPS指令系统(2010-4-22)_第1页
MIPS指令系统(2010-4-22)_第2页
MIPS指令系统(2010-4-22)_第3页
MIPS指令系统(2010-4-22)_第4页
MIPS指令系统(2010-4-22)_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MIPS指令系统 TANZHIHU 汇编语言 n CPU主要工作:执行指令 n 指令是CPU执行最主要的操作 n 不同类型的CPU执行不同指令集 pInstruction Set Architecture (ISA). p Intel 80 x86 (Pentium 4), IBM/Motorola PowerPC (Macintosh), MIPS, Intel IA64, . Page 2 MIPS体系结构 n MIPS公司发布了第一个商用RISC结构 n 本课程将讨论MIPS的一些细节 n 为什么选择MIPS而不是Intel 80 x86? p MIPS简洁雅致,不会陷入繁琐的细节. p

2、 MIPS广泛应用于嵌入式应用 p X86平台主要应用于PC领域 Page 3 汇编语言的变量-寄存器 n 汇编语言不能使用变量(C、JAVA可以) p Int a; float b; p 寄存器变量没有数据类型 n 汇编语言的操作对象是寄存器 n 好处:寄存器是最快的数据单元 n 缺陷:寄存器数量有限 p 编程必须小心,仔细的高效使用各寄存器 n MIPS寄存器字长-32bits= 1 Word n MIPS指令集包括32个通用寄存器 n 32 registers in MIPS n $0, $1, $2, $30, $31 Page 4 32个MIPS寄存器 Page 5 寄存器编号MIP

3、S助记符释义备注 0$Zero固定值为0硬件置位 23$v0$v1函数调用返回值 47$a0$a3函数调用参数4个参数 815$t0$t7暂存寄存器8个参数 1623$s0$s7通用寄存器调用之前需保存 2425$t8$t9暂存寄存器2个 28$gp全局指针 29$sp堆栈指针 30$fp帧指针 31$ra函数返回地址 1$at汇编器保留 2627$k0$k1操作系统保留 加减指令 n 加法 p a = b + c (in C) p add $s0,$s1,$s2 (in MIPS) p C语言变量a, b, c编译后对应寄存器 $s0,$s1,$s2 n 减法 p d = e f (in C

4、) p sub $s3,$s4,$s5 (in MIPS) p C语言变量d, e, f编译后对应寄存器 $s3,$s4,$s5 Page 6 加减指令 n 如何编译下面的C语言表达式? a = b + c + d - e; n 编译成多行汇编指令 add $t0, $s1, $s2 # temp = b + c add $t0, $t0, $s3 # temp = temp + d sub $s0, $t0, $s4 # a = temp - e n 一个简单的C语言表达式变成多行汇编语句 n #号后面是注释 Page 7 内存数据访问指令lw sw lb sb lh sh n 读内存指令

5、p g = h + A8; ; (in C) p lw $t0,32($s3) # $t3为A0地址 (in MIPS) p add $s1,$s2,$t0 # g=h+A8 n 变址寻址 p 偏移量+基址寄存器 n 写内存指令 p A12 = h + A8; ; p lw $t0,32($t3) # get A8 (in MIPS) p add $t0,$s2,$t0 # A12=h+A8 p sw $t0,48($s3) #store A12 Page 8 加立即数 n 常数相加指令 p g = g + 4; ; (in C) p Lw $t0, 0($s3) # $t0=4 $s3=Ad

6、dress(4) p add $s1,$s1,$t0 # g=g+4 n 立即数相加指令 p addi $s3,$s3,4 # $s3=$s3+4 (in MIPS) Page 9 指令实例语义注释 加 add $s1,$s2,$s3$s1=$s2+$s3 寄存器寻址 减 sub $s1,$s2,$s3$s1=$s2-$s3 寄存器寻址 加立即数 addi $s1,$s2,100$s1=$s2+100 寄存器寻址+立即数寻址 取字 lw $s1,100($s2)$s1=Mem$s2+100 寄存器寻址+变址寻址 存字 sw $s1,100($s2)Mem$s2+100=$s1 寄存器寻址+变址

7、寻址 条件判断指令 beq reg1,reg2,label n C语言条件判断指令 If (a=b) i=1; else i=2; n 等效C指令 If (a=b) goto L1; i=2; goto L2; L1:i=1; L2: Page 10 n 等效MIPS指令 beq $s0,$s1,L1 addi $s3,$Zero,2 j L2; L1:addi $s3,$Zero,1 L2: n MIPS数据传送指令 addi $s3,$Zero,1 # $s3=1 add $s3,$2,$Zero # $s3=$s2 MIPS 条件判断指令 n 条件跳转 p If (reg1=reg2)

8、goto Label1 (C语言) p beq reg1,rege2,Label1 (MIPS指令) p bne reg1,rege2,Label2 n 无条件跳转指令 p goto Label; (C语言) p J label (MIPS指令) p beq $Zero,$Zero,label (MIPS指令) Page 11 逻辑运算 n 移位指令 p a=b2; C语言 p sll $s1,$s2,2 # shift left p srl $s1,$s2,2 # shift right n 逻辑运算 p and $t0,$t1,$t2 # t0=t1 i = i + j; while (i

9、 != h); n 重写代码 pLoop: g = g + Ai; i = i + j; if (i != h) goto Loop; n 编译后的变量映射: Page 13 ghijA0 $s1$s2$s3$s4$s5 循环结构 n 最后编译的MIPS代码: Loop: sll $t1,$s3,2 # $t1= 4*I addu $t1,$t1,$s5 # $t1=addr A+4i lw $t1,0($t1) # $t1=Ai addu $s1,$s1,$t1 # g=g+Ai addu $s3,$s3,$s4 # i=i+j bne $s3,$s2,Loop # goto Loop #

10、if i!=h n 原始C代码: Loop:g = g + Ai; i = i + j; if (i != h) goto Loop; Page 14 比较指令 slt slti n MIPS比较指令(Set on Less Than) n slt reg1,reg2,reg3 n if (reg2 reg3) (C语言) reg1 = 1; else reg1 = 0; n If (gh) goto Less; n (用slt,bne 两条指令实现) n slt $t0,$s0,$s1 # $t0 = 1 if gh bne $t0,$0,Less # goto Less # if $t0!

11、=0 # (if (gh) Less: Page 15 MIPS过程调用 n C语言函数调用 int function(int a ,int b) return (a+b); n MIPS实现过程调用的机制 p返回地址寄存器 $ra p参数寄存器 $a0, $a1, $a2, $a3 p返回值寄存器 $v0 $v1 p局部变量 $s0$s7 p堆栈指针 $sp Page 16 过程调用实现机制 sum(a,b); /* a,b:$s0,$s1 */ int sum(int x, int y) return x+y; 1000 add $a0,$s0,$zero # x = a 1004 add

12、 $a1,$s1,$zero # y = b 1008 addi $ra,$zero,1016 # $ra=1016 1012 j sum # 跳转,调用过程sum 1016 2000 sum: add $v0,$a0,$a1 # 过程入口 2004 jr $ra # new # 返回主程序 instruction Page 17 J 1016 1008 jal sum 1012 过程调用机制 n JAL Label #link and jump n 等效于如下指令 $ra=PC+4; #save next instruction address J Label n 过程返回指令 Jr $ra

13、 #return to main program n 问题:利用$ra做返回地址,如果过程嵌套如何返回? p$ra 会被多次覆盖 p利用堆栈保存$ra Page 18 多级过程调用 int sumSquare(int x, int y) return mult(x,x)+ y; n 主程序调用sumSquare(x,y), sumSquare 调用 mult(x,y). n 调用sumSquare(x,y)时 $ra保存一次,保证该过程执 行完毕后能返回主程序。 n 但调用 mult时会覆盖$ra n 在调用mult时需要保存 sumSquare的返回地址 Page 19 堆栈操作 n sum

14、Square: addi $sp,$sp,-8 # space on stack sw $ra, 4($sp) # save ret addr sw $a1, 0($sp) # save y add $a1,$a0,$zero # mult(x,x) jal mult # call mult lw $a1, 0($sp) # restore y add $v0,$v0,$a1 # mult()+y lw $ra, 4($sp) # get ret addr addi $sp,$sp,8 # restore stack jr $ra n mult: . n 注意:除了返回地址以外,函数参数等会覆

15、盖的变量都需要入栈 Page 20 “push” “pop” 32位定长MIPS指令格式(R型指令) n OP:指令的基本操作-操作码 n Rs:第一个源操作数寄存器 n Rt:第二个源操作寄存器 n Rd:存放结果的目的操作寄存器 n Shamt:偏移量,用于移位指令 n Funct:函数,对操作码进行补充 Page 21 OPRSRtshamtRd 6bits funct 5bits5bits5bits5bits6bits R 型指令 MIPS指令格式 (R型指令) Page 22 6bits5bits5bits5bits5bits6bits 指令格式OPrsrtrdshamtfunct

16、addR0 RegRegReg 03210 sub减R0 RegRegReg 03410 andR0 RegRegReg 36 orR0 RegRegReg 37 norR0 RegRegReg 39 sllR0 RegRegReg 0 srlR0 RegRegReg 2 jrR0 REG00 08 addR0 181917 32 n add $s1,$s2,$s3 # machine code 0 x2538820 MIPS指令格式 (I、J型指令) Page 23 6bits5bits5bits5bits5bits6bits 指令格式OPrsrtrdshamtfunct addR0 Reg

17、RegReg 03210 addiI8 RegReg16bits 立即数 lwI35 RegReg16bits 立即数 swI43 RegReg16bits 立即数 andiI12 RegReg16bits 立即数 oriI13 RegReg16bits 立即数 beqI4 RegReg16bits 立即数(相对寻址) bneI5 RegReg16bits 立即数(相对寻址) jJ2 26bit 立即数(伪直接寻址) jalJ3 26bit 立即数(伪直接寻址) MIPS指令格式 Page 24 OPRSRtshamtRd 6bits funct 5bits5bits5bits5bits6bits OPRSRt 6bits 立即数 5bits5bits16bits OP 6bits 立即数 26bits R 型指令 I 型指令 J 型指令 MIPS寻址方式总结 n 寄存器寻址 n 基址寻址 n 立即数寻

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论