PA2.1补充

1.nemu和dummy

       很多人不知道输入make ARCH=x86-nemu ALL=dummy run后要做什么,疑惑为什么没有出现讲义上出现的输出内容。究其根本还是没有去理解讲义,仅仅是照着讲义输命令,一旦到了讲义上没有直接说明的部分就完全不知道要干嘛。而且PA是一个不断为后面的内容做铺垫的过程,不去理解讲义让你做的是到底什么,为什么要这么做,那么自然就更不知道下一步该怎么走。
       而现在不知道运行dummy是什么意思,就是PA1留下来的坑——仅仅写了几个函数,实现了nemu的基本调试命令,然而根本没有弄清nemu是什么。回顾PA1,其实有一个非常关键的信息,大部分人都没有注意到。讲义中有提到,输入make run后,nemu会将一个mov的客户程序作为默认参数,而而这个mov程序里只有代码中已实现的mov指令,也就是默认情况下,运行nemu就相当于在nemu中运行了一个只有mov指令的客户程序(在PA1测试过程中我们也可以看到输出的调试信息中指令名称全是mov)。然后再回到PA2.1,这次make run加了参数,讲义又说是要调试成功dummy程序,所以显然make ARCH=x86-nemu ALL=dummy run的作用就是在nemu中运行dummy程序。那么接下来的操作就和PA1一样了,你可以用各种本来就有的和在PA1中实现的调试命令来调试dummy。要运行dummy,自然就是用c命令,但为了具体了解到每一步的执行情况,我们这里选用单步调试,即si命令,然后类似如下效果:

这里写图片描述
       将输出的信息与dummy的反汇编结果进行对比,即可知道指令实现是否正确(但只能作为实现正确无bug的必要条件)。直到最后输出HIT A GOOD TRAP,说明程序运行结束且无问题;若为HIT A BAD TRAP,则说明仍有某条指令实现有问题。

2. 填写代码过程中i386手册的使用

       在理解前面一个问题后,再来看如何利用手册来完成代码。
       首先一步步执行程序(本示例程序不为dummy),直到出现“i386 Manual”,如下图:
这里写图片描述

       我们可以在输出的提示信息中看到,从83字节开始的opcode开始出现问题,也就是无法识别83开头的操作码,即这一步待实现的指令是83开头的。

       然后在反汇编文件中查看对应代码,得知是and指令没有实现。
这里写图片描述
       在手册附录A中,查看83,即8行3列,得知83对应有一个指令组grp1,且操作源和目标分别为“I” 和“E”。
       这里写图片描述
       所以译码函数为SI2E,执行函数由于为指令组,所以填的是grp1。
这里写图片描述
  PS:opcode_table每行有四个指令,前面的注释是这一行的起始值,所以这一行是有0x80,0x81,0x82,0x83四个指令,而不是这一行都是0x80。

       接着在手册中找到and指令83形式的具体描述,结合我之前发的博客链接,可知and指令是在83指令组中的第5个指令,在grp1中相应位置填写执行函数即可,如果执行函数中有TODO,则根据具体情况再去实现。
这里写图片描述
       如果函数的填写和实现均无问题,那么再次运行程序,调试至这一步时会发现输出和反汇编代码相近的信息。然后继续运行至下个需要实现的指令,重复以上步骤,直至HIT A GOOD/BAD TRAP。

猜你喜欢

转载自blog.csdn.net/qq_21110935/article/details/80025933
pa
2.1