如果有什么地方有误 请多多指教;

写这个不是让同学们直接抄的,请弄懂原理哦,我觉得我解释的蛮清楚了。

遇到了问题也可以评论留言或者私信我;

pa1代码➕思路,pa2代码+思路,pa3仙剑奇侠传仅代码。见评论区。

1 PA1 – 开天辟地的篇章:最简单的计算机

1.3 监视点

1)监视点的结构体

typedef struct watchpoint {  int NO;  //编号struct watchpoint *next;  int value;  //旧值,int newvalue;  //新值,char type;  //类型监视点w or断点bchar Enb;  //是否开启char str[32];  //被监视的表达式/* TODO: Add more members if necessary */  } WP; 
  1. 实现监视点的池的管理。

new_wp是从free链表中取一个结点给head链表,且将表达式、值赋给它,修改开关,并输出该节点的编号。运用正则表达式判断是否为断点,若是则type为b,否则为w,具体见下文断点处。

free_wp函数是遍历head链表直到找出对应NO的结点,从head中删除,添加到free链表中。同时修改类型、表达式、值、开关。

3)温故而知新

框架代码中定义wp_pool等变量时使用了关键字static,在此处的含义是静态全局变量,该变量只能被本文件中的函数调用,并且是全局变量,而不能被同一程序其他文件中的函数调用。在此处使用static是为了避免它被误修改。

  1. 实现以下功能:
  1. 如讲义中所言,每当cpu_exec()执行完一条指令,调用函数judge_wp对所有表达式求值判断是否变化,若变化则返回-1,暂停,输出提示并返回。

代码如下:

在cpu-exec.c中:

/* TODO: check watchpoints here. */  int judge=judge_wp();  if(judge==-1)  {  nemu_state = NEMU_STOP;  printf("Triggered the monitoring point\n");  return;  }  

在watchpoint.c中:

结果截图:

3)使用info w来打印监视点信息。这里在cmd_info中调用了函数print_wp(),代码如下:

void print_wp()
{  printf("Num\tType\tEnb \t\t Value\t\t  What\n");  for(int i=0;i<NR_WP;i++)  printf("%4d\t%c\t%c\t\t0x%x\t%s\n",wp_pool[i].NO,wp_pool[i].type,wp_pool[i].Enb,wp_pool[i].value,wp_pool[i].str);
}  

结果截图:

3、删除监视点。在cmd_d中调用free_wp函数即可。

结果截图:

1.4 断点

1)断点;

代码在上面已经贴出。运用正则表达式判断是否为断点格式:$eip==0x16进制数字,regcomp()函数编译正则表达式,执行成功返回0,则type为b,否则为w。

截图:

2)一点也不能长?

必须的。因为当我们在调试器中对代码的某一行设置断点时,会把这里本来指令的第一个字节保存起来,然后写入一条INT 3指令,机器码为0xcc,仅有一个字节,设置和取消断点时也需要保存和恢复一个字节。

断点机制不能正常工作。因为INT3断点将被调试进程中对应地址处的字节替换为0xcc,当int3指令的长度变成2个字节,其他指令同x86,会导致这里本来指令的第一个字节被2个字节所代替,空间不够,不正确。

3)随心所欲的断点。

将断点设置在指令的非首字节,就无法检测到断点。因为会检测函数的地址,读取它的第一个字节,判断是否等于0xCCH。

4)NEMU的前世今生。

模拟器emulator和调试器debugger的不同。我觉得dubugger是一个命令行调试工具,设置断点,调试程序,测试bug,然后emulator是一个载体,就是虚拟机,是一个独立的系统,不会对电脑本身的系统造成影响,我们可以借助它兼容不同的软件。

我觉得gdb和nemu中我们在实现的功能好像差不多,但是gdb是可以直接在函数某一行或是函数入口处设置断点,可以随便查看变量当前的值。

1.6 必答题:

1)理解基础设施;

在调试上花费75h,简易调试器帮它节省50h。

2)查阅i386手册;

1、EFLAGS寄存器中的CF位是什么意思?

P34页中提到参阅附录c,CF是进位标志;

P419页中写到CF位:在最高位发生进位或者借位的时候将其置1,否则清零。

2、ModR/M字节是什么?

P241-243页。ModR/M由Mod,Reg/Opcode,R/M三部分组成。Mod是前两位,提供寄存器寻址和内存寻址,Reg/Opcode为345位,如果是Reg表示使用哪个寄存器,Opcode表示对group属性的Opcode进行补充;R/M为678位,与mod结合起来查图得8个寄存器和24个内存寻址

3、mov指令的具体格式是怎么样的?

P347页。格式是DEST ←SRC.

3)shell命令;

.c和.h文件有3994行代码,使用命令:

find . -name "*[.h|.cpp]" | xargs wc -l 

和框架代码相比,在PA1中写了1008行代码;

log回转代码回到过去;除去空行之外, nemu/ 目录下的所有.c 和.h 文件总共有3308行代码。

find . –name “*[.cpp|.h]” | xargs grep “^.” | wc -l

-Wall 使GCC产生尽可能多的警告信息,取消编译操作,打印出编译时所有错误或警告信息。

-Werror 要求GCC将所有的警告当成错误进行处理,取消编译操作。

使用-Wall和-Werror就是为了找出存在的错误,尽可能地避免程序运行出错,优化程序。

PA1.3 代码+笔记相关推荐

  1. CSDN技术主题月----“深度学习”代码笔记专栏

    from: CSDN技术主题月----"深度学习"代码笔记专栏 2016-09-13 nigelyq 技术专题 Hi,各位用户 CSDN技术主题月代码笔记专栏会每月在CODE博客为 ...

  2. 看完师兄的代码笔记,我失眠了

    祝大家中秋节快乐! 最近很多公司的秋季招聘都已经启动了. 想必大家(尤其是经历过求职面试的)都知道,数据结构和算法在求职笔试/面试中的重要性. 纵观如今的互联网公司面试,清一色地都在重点考查这块,不开 ...

  3. LSTM TF核心实现代码笔记

    LSTM TF核心实现代码笔记 1. LSTM TF里的核心代码实现 2. 代码详细讲解 1. LSTM TF里的核心代码实现 LSTM网络的核心实现是在这个包里tensorflow/python.k ...

  4. 2018年最新Spring Boot视频教程附代码笔记资料(50G)

    1. Spring Boot  项目实战 ----- 技术栈博客企业前后端 链接:https://pan.baidu.com/s/1hueViq4 密码:4ma8 2.Spring Boot  项目实 ...

  5. Python Text Processing with NLTK 2.0 Cookbook代码笔记

    如下是<Python Text Processing with NLTK 2.0 Cookbook>一书部分章节的代码笔记. Tokenizing text into sentences ...

  6. Transformer课程 第8课NER案例代码笔记-IOB标记

    Transformer课程 第8课NER案例代码笔记-IOB标记 NER Tags and IOB Format 训练集和测试集都是包含餐厅相关文本(主要是评论和查询)的单个文件,其中每个单词都有一个 ...

  7. 2018尚硅谷SpringBoot视频教程附代码+笔记+课件(内含Docker)

    尚硅谷SpringBoot视频教程(内含Docker)附代码+笔记+课件 下载地址:百度网盘

  8. 吴恩达机器学习MATLAB代码笔记(1)梯度下降

    吴恩达机器学习MATLAB代码笔记(1)梯度下降 单变量线性回归 1.标记数据点(Plotting the Date) fprintf('Plotting Data') data = load('D: ...

  9. Transformer课程 第8课NER案例代码笔记-部署简介

    Transformer课程 第8课NER案例代码笔记 BERT微调器 NER是信息提取的子任务,旨在将非结构化文本中提到的命名实体定位并分类为预定义类别,如人名.组织.位置.医疗代码.时间表达式.数量 ...

最新文章

  1. 【C++】google glog详解
  2. Redis为什么变慢了,来慢慢盘查?
  3. 每天一道LeetCode-----存在一个由加油站组成的环路,判断是否可以从某个加油站出发环绕一周
  4. 扩展--使用队列来优化递归操作完成文件下载
  5. mysql 如何用一条SQL将一张表里的数据插入到另一张表 3个例子
  6. 第二章 物理层 2,3 数据通信基础知识 [计算机网络笔记]
  7. 做手机系统,鸿蒙怎样才有机会
  8. mysql数据库存储过程异常处理
  9. 总结:计算机组成与设计(硬件/软件接口)-第四章 处理器
  10. LBP算法,空间金字塔 文献阅读报告《基于差分量化局部二值模式的人脸反欺诈算法研究》
  11. 使用Altium Designer绘制电路原理图
  12. 打印控件的 frame
  13. 在北理珠,如何快速被动了解(社工)一个学生
  14. Windows查看快捷键占用情况
  15. Android平台音视频RTMP推送|GB28181对接之动态水印设计
  16. Ps 钢笔工具的使用
  17. OllyDebug破解第一个 CM 程序 《Acid burn.exe》
  18. 为什么会有视频号?朋友圈还不够吗?
  19. C++容器方法大汇总
  20. 音频频谱显示-基于fmod设计音乐播放器并动态显示频谱图(二)

热门文章

  1. 2019年了桌面CPU还吊打笔记本CPU?真相了
  2. django搭建个人博客(一)
  3. dos(cmd)命令
  4. 收藏:青春,最美!哈理工学子合唱《我的骄傲》(原唱杨培安)
  5. 拜登留学新政:美国读博直接拿绿卡,增加H1B签证限额!但未来留美门槛反而变高了?...
  6. matlab作业1,matlab作业报告一
  7. Self-attention中为什么softmax要除d_k
  8. “多源异构”和“异构同源”定义区分详解
  9. android html 布局设计工具,教你使用Android SDK布局优化工具layoutopt
  10. Linux shell 命令学习 大全