您好,欢迎访问三七文档
高等计算机体系结构高等计算机体系结构高等计算机体系结构高等计算机体系结构((((AdvancedComputerArchitectureAdvancedComputerArchitectureAdvancedComputerArchitectureAdvancedComputerArchitecture))))MIPSMIPSMIPSMIPS模拟器模拟器模拟器模拟器SPIMSPIMSPIMSPIM李险峰(lixianfeng@pkusz.edu.cn)北京大学深圳研究生院2222SPIMSPIMSPIMSPIM�SPIM由威斯康辛大学的JamesLarus开发的MIPS模拟器,可在x86机器上模拟执行MIPS32程序�SPIM的输入是MIPS汇编语言程序,而不是机器语言程序�有Unix/Linux和Windows两个版本−Unix/Linux:spim/xspim−Windows:PCSpim�SPIM下载网址:~larus/spim.html3333SPIMSPIMSPIMSPIM下载下载下载下载4444SPIMSPIMSPIMSPIM安装安装安装安装Unix/Linux安装步骤较多,需要一定的Unix/Linux使用经验5555SPIMSPIMSPIMSPIM界面界面界面界面寄存器状态窗口MIPSMIPSMIPSMIPS汇编程序窗口数据区窗口除此之外,还有一个独立窗口consoleconsoleconsoleconsole…………信息输出窗口6666编辑编辑编辑编辑MIPSMIPSMIPSMIPS汇编程序汇编程序汇编程序汇编程序MIPS32MIPS32MIPS32MIPS32指令系统快速参考表7777编辑编辑编辑编辑MIPSMIPSMIPSMIPS汇编程序汇编程序汇编程序汇编程序例:a=x+y;b=x-y编辑如下汇编代码(简化起见,先不考虑参数,假设x=3,y=2x=3,y=2x=3,y=2x=3,y=2),,,,li$t0,3li$t1,2add$t2,$t0,$t1sub$t3,$t0,$t18888完整的完整的完整的完整的MIPSMIPSMIPSMIPS汇编程序汇编程序汇编程序汇编程序li$t0,3li$t1,2add$t2,$t0,$t1sub$t3,$t0,$t1给出程序入口给出程序出口main:li$t0,3li$t1,2add$t2,$t0,$t1sub$t3,$t0,$t1jr$ra9999加载汇编程序加载汇编程序加载汇编程序加载汇编程序点击“打开”图标或菜单,选取要加载的汇编程序程序初始化,为被执行的程序准备好现场(传递参数等)真正由编译器生成的程序初始化部分比SPIMSPIMSPIMSPIM中要复杂很多,例如gccgccgccgcc编译的CCCC程序入口为__start__start__start__start,除自身的初始化指令外,还调用一系列库例程(libraryroutinelibraryroutinelibraryroutinelibraryroutine)进行初始化10101010执行汇编程序执行汇编程序执行汇编程序执行汇编程序11111111单步执行单步执行单步执行单步执行每次执行一条指令后停下来,用于程序调试12121212设置断点(设置断点(设置断点(设置断点(breakpointsbreakpointsbreakpointsbreakpoints))))通过对给定指令地址设置断点,程序每次执行到该位置时会停下来。设置断点是程序调试中十分有用的工具13131313设置断点(设置断点(设置断点(设置断点(breakpointsbreakpointsbreakpointsbreakpoints))))断点设置对话框,输入断点地址后,点击Add增加该断点。可以设置多个断点。14141414改进版本:读入与输出改进版本:读入与输出改进版本:读入与输出改进版本:读入与输出例:a=x+y;b=x-y#lixianfeng–2010/09/20#sum_diff.s:computesthesum&differenceofx&y#providedbytheuser#Registersused:#$t0/$t1:usedtoholdthefirstnumberx/y#$t2/$t3:usedtoholdthesum/differenceof$t0&$t1#$v0:syscallparametermain:#Getfirstnumberfromuser,putinto$t0.#Getsecondnumberfromuser,putinto$t1.add$t2,$t0,$t1sub$t3,$t0,$t1#Printout$t2&$t3jr$ra15151515SPIMSPIMSPIMSPIM系统调用系统调用系统调用系统调用不同的OSOSOSOS提供不同系统调用(syscall)(syscall)(syscall)(syscall),SPIMSPIMSPIMSPIM中的系统调用如下:16161616改进版本:读入与输出改进版本:读入与输出改进版本:读入与输出改进版本:读入与输出例:a=x+y;b=x-y#lixianfeng–2010/09/20……main:##Getfirstnumberfromuser,putinto$t0.li$v0,5#loadsyscallread_intinto$v0syscall#makethesyscallmove$t0,$v0#movethenumberreadinto$t0##Getsecondnumberfromuser,putinto$t1.li$v0,5#loadsyscallread_intinto$v0syscall#makethesyscallmove$t1,$v0#movethenumberreadinto$t0add$t2,$t0,$t1sub$t3,$t0,$t1#Printout$t2&$t3jr$ra17171717改进版本:读入与输出改进版本:读入与输出改进版本:读入与输出改进版本:读入与输出例:a=x+y;b=x-y#lixianfeng–2010/09/20……main:##Getfirstnumberfromuser,putinto$t0.……##Getsecondnumberfromuser,putinto$t1.……#Printout$t2&$t3move$a0,$t2#movethenumbertoprintinto$a0li$v0,1#loadsyscallprint_intinto$v0syscall#makethesyscallmove$a0,$t2#movethenumbertoprintinto$a0li$v0,1#loadsyscallprint_intinto$v0syscall#makethesyscalljr$ra18181818改进版本:读入与输出改进版本:读入与输出改进版本:读入与输出改进版本:读入与输出输入与输出均在console窗口中进行输入数输出结果19191919““““HelloWorldHelloWorldHelloWorldHelloWorld!!!!””””示例示例示例示例#hello.s:AHelloWorldprogram#Registersused:#$v0:syscallparameterandreturnvalue#$a0:syscallparameter--thestringtoprint.textmain:la$a0,hello_msg#loadtheaddressofhello_msginto$a0li$v0,4#loadsyscallprint_stringinto$v0syscall#makethesyscalljr$ra.datahello_msg:.asciizHello,World!\n20202020字符串定义与定位字符串定义与定位字符串定义与定位字符串定义与定位在代码中定位字符串字符串在程序数据段中的位置还原为ASCIIASCIIASCIIASCII字符…………TheByteEndianProblemTheByteEndianProblemTheByteEndianProblemTheByteEndianProblem…………21212121ASCIIASCIIASCIIASCII字符集字符集字符集字符集22222222条件执行示例条件执行示例条件执行示例条件执行示例读入两个整数,输出其中较大者#cond.asm--printsthelargeroftwonumbersprovidedbytheuser.#Registersused:#$t0/$t1-usedtoholdthefirst/secondnumber.#$t2-usedtostorethelargerof$t1and$t2..textmain:##Getfirstnumberfromuser,putinto$t0.li$v0,5#loadsyscallread_intinto$v0.syscall#makethesyscall.move$t0,$v0#movethenumberreadinto$t0.##Getsecondnumberfromuser,putinto$t1.……………………##putthelargerof$t0and$t1into$t2.##(placeholdercomment)##Printout$t2.move$a0,$t2#movethenumbertoprintinto$a0.li$v0,1#loadsyscallprint_intinto$v0.syscall#makethesyscall.jr$ra23232323条件执行示例条件执行示例条件执行示例条件执行示例条件执行部分#cond.asm--printsthelargeroftwonumbersprovidedbytheuser.#Registersused:#$t0/$t1-usedtoholdthefirst/secondnumber.#$t2-usedtostorethelargerof$t1and$t2..textmain:##Getfirstnumberfromuser,putinto$t0.........................##putthelargerof$t0and$t1into$t2.bgt$t0,$t1,t0_bigger#If$t0$t1,branchtot0_biggermove$t2,$t1#otherwise,copy$t1into$t2.bendif#andthenbranchtoendift0_bigger:move$t2,$t0#copy$t0into$t2endif:##Printout$t2.……………………jr$ra24242424过程调用示例过程调用示例过程调用示例过程调用示例回顾过程调用(procedurecall)的规则25252525过程调用示例过程调用示例过程调用示例过程调用示例回顾过程调用(procedurecall)的规则26262626过程调用示例过程调用示例过程调用示例过程调用示例回顾过程调用(procedurecall)的规则27272727过程调用示例过程调用示例过程调用示例过程调用示例斐波那契数列−fib(0)=1−fib(1)=1−fib(2)=fib(0)+fib(1)=2−fib(3)=fib(1)+fib(2)=3−fib(4)=fib(2)+fib(3)=5−fib(5)=fib(3)+fib(4)=8−fib(6)=fib(4)+fib(5)=13−…−fib(n)=fib(n-2)+fib(n-1),forn≥228282828斐波那契数列斐波那契数列斐波那契数列斐波那契数列#fib.s–computingFibonaccinumbers#fib(n)=fib(n-2)
本文标题:SPIM模拟器
链接地址:https://www.777doc.com/doc-3325598 .html