NEMU PA2 菜鸡记录
闲话
NEMU是南大的一个课设,你天拿来当小学期任务,端地一番折磨
本篇博客由PA2实验报告改编而来,后续可能会有必做题的过程也可能没有
看阿瓜的懒惰程度了
实验进度表
任务序号 | 任务内容 | 完成情况 |
---|---|---|
必做任务1 | 运行用户程序mov.c | 已完成 |
必做任务2 | 实现更多指令 | 已完成 |
必做任务3 | 实现binary scaling | 已完成 |
必做任务4 | 为表达式求值添加变量的支持 | 已完成 |
必做任务5 | 实现loader | 已完成 |
选做任务1 | 打印栈帧链 | 已完成 |
选做任务2 | 改变程序的行为 | 未完成 |
必做题
思考题
思考题1:main函数返回到哪里
- 在testcase里的测试文件中,程序从start函数里跳转到main函数,main函数执行完毕后再返回到start里。所以HIT GOOD TRAP 一般都在0x100014处
思考题2:比较FLOAT和float
- 其区别首先在于FLOAT是定点数而float是浮点数,作为浮点数,float对于规格化的值与非规格化的值两种情况其阶码值和尾数的计算公式并不一样,这就使得其可以比较精确地表示0和非常接近于0的数以及非常大的数。而FLOAT由于定点化,在牺牲表数范围和精度的同时换取了速度。
思考题3:消失的符号
- 符号表symtab中包含的符号有三类:1.非静态的c函数和全局变量;2.其他模块中定义的非静态c函数和全局变量;3.只在该模块中定义和引用的带static属性的C函数和全局变量。
对于非静态的局部变量则在栈中管理,并不被symtab包含
思考题4:堆和栈在哪里
- 堆和栈的数据存取比较频繁,如果放入可执行文件可能导致运行速度下降。程序执行时,再从内部调用堆和栈。
思考题5:如何识别不同格式的可执行文件
- ELF文件头有魔数,可以用做识别文件格式。
思考题6:冗余的属性
- FileSiz表示程序头在文件中所占的大小,MemSiz表示程序头在内存中所占用的大小。
实验遇到的问题、思考、解决办法
- 对于必做任务三的FLOAT.c中的f2F函数实现曾出现过错误,然后修改过后仍hit bad trap,然后make clean之后再make run便可以运行。当时不知道make clean的原理,误以为f2F函数并没有错误,故又恢复原貌,导致提交的前一版stage2_finished不能通过integral.c测试。然后多次测试后发现FLOAT.c文件在修改后并不会重新编译,除非make clean。经助教齐学长讲解,明白了FLOAT.c生成的是动态链接库,不是可重定向目标文件,所以make clean之后才会重新编译。故最后修改正确之后补交了一版stage2_finished_new。
实验心得
-
ELF头文件前几个数是为魔数(magic number),用做识别文件类型之用。
-
HIT BAD TRAP一般可能是三种错误,
- 1.exec.c文件里opcode表填写错误,比如某条指令形式应为rm2r误写成r2rm;
- 2,.指令的具体实现出现错误,例如jcc系列指令的条件判断写错或者call、ret、push、pop、leave等指令的ebp、esp寄存器相关内容出错;
- 3.FLOAT函数具体实现出错。
-
需要写的程序不一定只在TODO标明的地方,其临近处或者其他地方也可能根据需要而添加或者修改代码
NEMU PA2 菜鸡记录
http://zqizhang.github.io/2021/09/30/NEMU_PA2/