教你安装Y86-64模拟器(GUI界面)

Y86-64模拟器是CSAPP里学习处理器体系结构需要用到的指令集。与x86-64相比,Y86-64指令集的数据类型、指令和寻址方式都要少一些。它的字节级编码也比较简单,机器代码没有相应的x86-64代码紧凑,不过设计它的CPU译码逻辑也要简单一些。
虽然Y86-64指令集很简单,它仍然足够完整,第四章的学习是完全基于该指令集的,我们要在linux下安装这个指令集的模拟器,包括SEQ和PIPE处理器的模拟器,以及GUI界面。

一、下载Y86-64模拟器

可以在这里下载完整的安装包(学校老师发的)

CMU CSAPP Y86-64模拟器

去CSAPP官网下载也可以。

二、安装词法分析工具

  1. 安装flex
$ sudo apt install flex
  1. 安装bison
$ sudo apt install bison

三、安装静态链接库TCL、TK(支持图形界面)

$ sudo apt-get install tcl-dev tk-dev

$ sudo apt-get install tcl8.5-dev tk8.5-dev

如果这一步报错可以不用理会。

四、解压安装包

$ tar vxf CMU-Y64.tar

在这里插入图片描述

五、修改Makefile文件

其实就是修改路径和刚才装的tcl、tk版本。

把三个方框里的内容作如下修改:

在这里插入图片描述

六、编译GUI界面

在CMU-Y64目录下:

$ make clean

$ make

这是最容易遇到问题的一步,几乎所有人都会在这里编译错误

  1. make后编译错误,错误信息如下:

(cd misc; make all)
make[1]: 进入目录“/home/dragon/sim/misc”
gcc -Wall -O1 -g -c yis.c
gcc -Wall -O1 -g -c isa.c
gcc -Wall -O1 -g yis.o isa.o -o yis
gcc -Wall -O1 -g -c yas.c
flex yas-grammar.lex
mv lex.yy.c yas-grammar.c
gcc -O1 -c yas-grammar.c
gcc -Wall -O1 -g yas-grammar.o yas.o isa.o -lfl -o yas
bison -d hcl.y
flex hcl.lex
gcc -O1 node.c lex.yy.c hcl.tab.c outgen.c -o hcl2c
make[1]: 离开目录“/home/dragon/sim/misc”
(cd pipe; make all GUIMODE=-DHAS_GUI TKLIBS="-L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5" TKINC="-I/usr/include/tcl8.5")
make[1]: 进入目录“/home/dragon/sim/pipe”
#Building the pipe-std.hcl version of PIPE
…/misc/hcl2c -n pipe-std.hcl < pipe-std.hcl > pipe-std.c
gcc -Wall -O2 -I/usr/include/tcl8.5 -I…/misc -DHAS_GUI -o psim psim.c pipe-std.c
…/misc/isa.c -L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5 -lm
/tmp/ccuL1R7t.o:(.data.rel+0x0):对‘matherr’未定义的引用

collect2: error: ld returned 1 exit status
Makefile:42: recipe for target ‘psim’ failed
make[1]: *** [psim] Error 1
make[1]: 离开目录“/home/dragon/sim/pipe”
Makefile:27: recipe for target ‘all’ failed
make: *** [all] Error 2

标黄字段说明进入pipe目录并编译psim.c和pipe-std.c时出现了对’matherr’未定义引用的错误,所以我们进入pipe文件夹中的psim.c和pipe-std.c文件,ctrl+f 搜索matherr,将包含matherr的语句注释掉,总共有两行,都在psim.c中:

在这里插入图片描述

  1. 继续make clean;make,输出信息如下:

rm -f *~ core
(cd misc; make clean)
make[1]: 进入目录“/home/dragon/sim/misc”
rm -f *.o *.yo .exe yis yas hcl2c mux4 ~ core.
rm -f hcl.tab.c hcl.tab.h lex.yy.c yas-grammar.c
make[1]: 离开目录“/home/dragon/sim/misc”
(cd pipe; make clean)
make[1]: 进入目录“/home/dragon/sim/pipe”
rm -f psim pipe-
.c *.o .exe ~
make[1]: 离开目录“/home/dragon/sim/pipe”
(cd seq; make clean)
make[1]: 进入目录“/home/dragon/sim/seq”
rm -f ssim ssim+ seq
-
.c *.o *~ *.exe *.yo *.ys
make[1]: 离开目录“/home/dragon/sim/seq”
(cd y86-code; make clean)
make[1]: 进入目录“/home/dragon/sim/y86-code”
rm -f *.o *.yis *~ *.yo *.pipe *.seq *.seq+ core
make[1]: 离开目录“/home/dragon/sim/y86-code”
(cd ptest; make clean)
make[1]: 进入目录“/home/dragon/sim/ptest”
rm -f *.o *~ *.yo *.ys
make[1]: 离开目录“/home/dragon/sim/ptest”
(cd misc; make all)
make[1]: 进入目录“/home/dragon/sim/misc”
gcc -Wall -O1 -g -c yis.c
gcc -Wall -O1 -g -c isa.c
gcc -Wall -O1 -g yis.o isa.o -o yis
gcc -Wall -O1 -g -c yas.c
flex yas-grammar.lex
mv lex.yy.c yas-grammar.c
gcc -O1 -c yas-grammar.c
gcc -Wall -O1 -g yas-grammar.o yas.o isa.o -lfl -o yas
bison -d hcl.y
flex hcl.lex
gcc -O1 node.c lex.yy.c hcl.tab.c outgen.c -o hcl2c
make[1]: 离开目录“/home/dragon/sim/misc”
(cd pipe; make all GUIMODE=-DHAS_GUI TKLIBS="-L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5" TKINC="-I/usr/include/tcl8.5")
make[1]: 进入目录“/home/dragon/sim/pipe”
#Building the pipe-std.hcl version of PIPE
…/misc/hcl2c -n pipe-std.hcl < pipe-std.hcl > pipe-std.c
gcc -Wall -O2 -I/usr/include/tcl8.5 -I…/misc -DHAS_GUI -o psim psim.c pipe-std.c
…/misc/isa.c -L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5 -lm
./gen-driver.pl -n 4 -f ncopy.ys > sdriver.ys
…/misc/yas sdriver.ys
./gen-driver.pl -n 63 -f ncopy.ys > ldriver.ys
…/misc/yas ldriver.ys
make[1]: 离开目录“/home/dragon/sim/pipe”
(cd seq; make all GUIMODE=-DHAS_GUI TKLIBS="-L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5" TKINC="-I/usr/include/tcl8.5")
make[1]: 进入目录“/home/dragon/sim/seq”
#Building the seq-std.hcl version of SEQ
…/misc/hcl2c -n seq-std.hcl <seq-std.hcl >seq-std.c
gcc -Wall -O2 -I/usr/include/tcl8.5 -I…/misc -DHAS_GUI -o ssim
seq-std.c ssim.c …/misc/isa.c -L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5 -lm
/tmp/cczSQwXi.o:(.data.rel+0x0):对‘matherr’未定义的引用

collect2: error: ld returned 1 exit status
Makefile:42: recipe for target ‘ssim’ failed
make[1]: *** [ssim] Error 1
make[1]: 离开目录“/home/dragon/sim/seq”
Makefile:27: recipe for target ‘all’ failed
make: *** [all] Error 2

由以上信息知pipe目录里的内容已经编译完成了,在进入seq目录时出现了编译错误。同第一步的做法,进入seq文件夹,在seq-std.c和ssim.c文件中寻找有matherr 的行,在ssim.c中找到了两行相关信息,注释掉:

在这里插入图片描述

  1. 继续重新编译,make clean;make
    输出以下信息:

rm -f *~ core
(cd misc; make clean)
make[1]: 进入目录“/home/dragon/sim/misc”
rm -f *.o *.yo .exe yis yas hcl2c mux4 ~ core.
rm -f hcl.tab.c hcl.tab.h lex.yy.c yas-grammar.c
make[1]: 离开目录“/home/dragon/sim/misc”
(cd pipe; make clean)
make[1]: 进入目录“/home/dragon/sim/pipe”
rm -f psim pipe-
.c *.o .exe ~
make[1]: 离开目录“/home/dragon/sim/pipe”
(cd seq; make clean)
make[1]: 进入目录“/home/dragon/sim/seq”
rm -f ssim ssim+ seq
-
.c *.o *~ *.exe *.yo *.ys
make[1]: 离开目录“/home/dragon/sim/seq”
(cd y86-code; make clean)
make[1]: 进入目录“/home/dragon/sim/y86-code”
rm -f *.o *.yis *~ *.yo *.pipe *.seq *.seq+ core
make[1]: 离开目录“/home/dragon/sim/y86-code”
(cd ptest; make clean)
make[1]: 进入目录“/home/dragon/sim/ptest”
rm -f *.o *~ *.yo *.ys
make[1]: 离开目录“/home/dragon/sim/ptest”
(cd misc; make all)
make[1]: 进入目录“/home/dragon/sim/misc”
gcc -Wall -O1 -g -c yis.c
gcc -Wall -O1 -g -c isa.c
gcc -Wall -O1 -g yis.o isa.o -o yis
gcc -Wall -O1 -g -c yas.c
flex yas-grammar.lex
mv lex.yy.c yas-grammar.c
gcc -O1 -c yas-grammar.c
gcc -Wall -O1 -g yas-grammar.o yas.o isa.o -lfl -o yas
bison -d hcl.y
flex hcl.lex
gcc -O1 node.c lex.yy.c hcl.tab.c outgen.c -o hcl2c
make[1]: 离开目录“/home/dragon/sim/misc”
(cd pipe; make all GUIMODE=-DHAS_GUI TKLIBS="-L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5" TKINC="-I/usr/include/tcl8.5")
make[1]: 进入目录“/home/dragon/sim/pipe”
#Building the pipe-std.hcl version of PIPE
…/misc/hcl2c -n pipe-std.hcl < pipe-std.hcl > pipe-std.c
gcc -Wall -O2 -I/usr/include/tcl8.5 -I…/misc -DHAS_GUI -o psim psim.c pipe-std.c
…/misc/isa.c -L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5 -lm
./gen-driver.pl -n 4 -f ncopy.ys > sdriver.ys
…/misc/yas sdriver.ys
./gen-driver.pl -n 63 -f ncopy.ys > ldriver.ys
…/misc/yas ldriver.ys
make[1]: 离开目录“/home/dragon/sim/pipe”
(cd seq; make all GUIMODE=-DHAS_GUI TKLIBS="-L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5" TKINC="-I/usr/include/tcl8.5")
make[1]: 进入目录“/home/dragon/sim/seq”
#Building the seq-std.hcl version of SEQ
…/misc/hcl2c -n seq-std.hcl <seq-std.hcl >seq-std.c
gcc -Wall -O2 -I/usr/include/tcl8.5 -I…/misc -DHAS_GUI -o ssim
seq-std.c ssim.c …/misc/isa.c -L/usr/lib/x86_64-linux-gun/ -ltk8.5 -ltcl8.5 -lm
make[1]: 离开目录“/home/dragon/sim/seq”
(cd y86-code; make all)
make[1]: 进入目录“/home/dragon/sim/y86-code”
…/misc/yas abs-asum-cmov.ys
…/misc/yas abs-asum-jmp.ys
…/misc/yas asum.ys
…/misc/yas asumr.ys
…/misc/yas asumi.ys
…/misc/yas cjr.ys
…/misc/yas j-cc.ys
…/misc/yas poptest.ys
…/misc/yas pushquestion.ys
…/misc/yas pushtest.ys
…/misc/yas prog1.ys
…/misc/yas prog2.ys
…/misc/yas prog3.ys
…/misc/yas prog4.ys
…/misc/yas prog5.ys
…/misc/yas prog6.ys
…/misc/yas prog7.ys
…/misc/yas prog8.ys
…/misc/yas prog9.ys
…/misc/yas prog10.ys
…/misc/yas ret-hazard.ys
make[1]: 离开目录“/home/dragon/sim/y86-code”

说明编译成功。

七、运行GUI界面

$ cd pipe

$ ./psim -t -g ../y86-code/asum.yo

在这里插入图片描述

八、按照文件夹内simguide文档操作进行实验即可

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值