目录
(Part B)make时报“ tk.h 没有那个文件或目录”
(part C)make时报pc_state, if_id_state, id_ex_state, ex_mem_state, mem_wb_state多次定义
make时报缺少flex
报错如下图。其实flex是linux的词法分析器,
命令sudo apt-get install flex即可安装
make时报错多次定义
/usr/bin/ld: yas.o:/home/jrweilinux/download/archlab/sim/misc/yas.h:13: multiple definition of `lineno'; yas-grammar.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
链接器报错,原因是重复定义。把yas.h中的int lineno前面加extern
保存后重新make,又有一个链接的错误:
解决方法:outgen.c中,做出以下修改
保存,即可成功make
(Part A) make前后多出了哪些文件
make前
make后
有用的是两个可执行文件yas和yis。
这两个的用处,先看下README,稍后有使用示例。
YAS Y86-64 assembler
YIS Y86-64 instruction level simulator
(Part B)make时报“ tk.h 没有那个文件或目录”
解决方案一:不使用tcl/tk
该错误出现在在Part B中make时
这需要打开该目录下的Makefile文件,注释掉第7、14、20行即可解决。
这样弄有一个问题,即在完成Part B后无法单步调试,报“To run in GUI mode, you must recompile with the HAS_GUI constant defined.”
所以推荐下面这个解决方案。
解决方案二:安装tcl/tk
命令为sudo apt-get install tcl8.6-dev tk8.6-dev tcl8.6 tk8.6,输入密码即可安装。
(网上有人说8.5,但8.5版本太老已经弃用,所以装8.6的即可成功)
然后把下面这个文件的这两行注释掉:
再次make,虽然有一些个警告,但可以make,也有图形化的调试界面。
(part C)make时报pc_state, if_id_state, id_ex_state, ex_mem_state, mem_wb_state多次定义
makefile前部改为:
sim.h的47行最前边加一个extern:
补充: .yo和.ys的含义
为什么Arch Lab的makefile里会出现.yo和.ys这么奇怪的后缀?
这两个后缀确实是作者自己编的,就像Y86-64语言是他们编的一样。其实.yo和.ys类比的是.o和.s文件。
对于x86-64来说,.c文件通过预处理、编译得到.s文件,.s文件通过汇编器得到.o文件。
类比,对于Y86-64来说,我们在本实验中直接写出.ys文件,.ys文件通过yas得到.yo文件,.yo文件送到yis里执行,可以看到执行结果。
这个yas和yis就是我们刚刚make出的可执行文件。
具体用法就是(如下图),copy_block.ys是我写出的Y86-64程序。