PA1.3 代码+笔记
如果有什么地方有误 请多多指教;
写这个不是让同学们直接抄的,请弄懂原理哦,我觉得我解释的蛮清楚了。
遇到了问题也可以评论留言或者私信我;
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;
- 实现监视点的池的管理。
new_wp是从free链表中取一个结点给head链表,且将表达式、值赋给它,修改开关,并输出该节点的编号。运用正则表达式判断是否为断点,若是则type为b,否则为w,具体见下文断点处。
free_wp函数是遍历head链表直到找出对应NO的结点,从head中删除,添加到free链表中。同时修改类型、表达式、值、开关。
3)温故而知新
框架代码中定义wp_pool等变量时使用了关键字static,在此处的含义是静态全局变量,该变量只能被本文件中的函数调用,并且是全局变量,而不能被同一程序其他文件中的函数调用。在此处使用static是为了避免它被误修改。
- 实现以下功能:
- 如讲义中所言,每当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 代码+笔记相关推荐
- CSDN技术主题月----“深度学习”代码笔记专栏
from: CSDN技术主题月----"深度学习"代码笔记专栏 2016-09-13 nigelyq 技术专题 Hi,各位用户 CSDN技术主题月代码笔记专栏会每月在CODE博客为 ...
- 看完师兄的代码笔记,我失眠了
祝大家中秋节快乐! 最近很多公司的秋季招聘都已经启动了. 想必大家(尤其是经历过求职面试的)都知道,数据结构和算法在求职笔试/面试中的重要性. 纵观如今的互联网公司面试,清一色地都在重点考查这块,不开 ...
- LSTM TF核心实现代码笔记
LSTM TF核心实现代码笔记 1. LSTM TF里的核心代码实现 2. 代码详细讲解 1. LSTM TF里的核心代码实现 LSTM网络的核心实现是在这个包里tensorflow/python.k ...
- 2018年最新Spring Boot视频教程附代码笔记资料(50G)
1. Spring Boot 项目实战 ----- 技术栈博客企业前后端 链接:https://pan.baidu.com/s/1hueViq4 密码:4ma8 2.Spring Boot 项目实 ...
- Python Text Processing with NLTK 2.0 Cookbook代码笔记
如下是<Python Text Processing with NLTK 2.0 Cookbook>一书部分章节的代码笔记. Tokenizing text into sentences ...
- Transformer课程 第8课NER案例代码笔记-IOB标记
Transformer课程 第8课NER案例代码笔记-IOB标记 NER Tags and IOB Format 训练集和测试集都是包含餐厅相关文本(主要是评论和查询)的单个文件,其中每个单词都有一个 ...
- 2018尚硅谷SpringBoot视频教程附代码+笔记+课件(内含Docker)
尚硅谷SpringBoot视频教程(内含Docker)附代码+笔记+课件 下载地址:百度网盘
- 吴恩达机器学习MATLAB代码笔记(1)梯度下降
吴恩达机器学习MATLAB代码笔记(1)梯度下降 单变量线性回归 1.标记数据点(Plotting the Date) fprintf('Plotting Data') data = load('D: ...
- Transformer课程 第8课NER案例代码笔记-部署简介
Transformer课程 第8课NER案例代码笔记 BERT微调器 NER是信息提取的子任务,旨在将非结构化文本中提到的命名实体定位并分类为预定义类别,如人名.组织.位置.医疗代码.时间表达式.数量 ...
最新文章
- 【C++】google glog详解
- Redis为什么变慢了,来慢慢盘查?
- 每天一道LeetCode-----存在一个由加油站组成的环路,判断是否可以从某个加油站出发环绕一周
- 扩展--使用队列来优化递归操作完成文件下载
- mysql 如何用一条SQL将一张表里的数据插入到另一张表 3个例子
- 第二章 物理层 2,3 数据通信基础知识 [计算机网络笔记]
- 做手机系统,鸿蒙怎样才有机会
- mysql数据库存储过程异常处理
- 总结:计算机组成与设计(硬件/软件接口)-第四章 处理器
- LBP算法,空间金字塔 文献阅读报告《基于差分量化局部二值模式的人脸反欺诈算法研究》
- 使用Altium Designer绘制电路原理图
- 打印控件的 frame
- 在北理珠,如何快速被动了解(社工)一个学生
- Windows查看快捷键占用情况
- Android平台音视频RTMP推送|GB28181对接之动态水印设计
- Ps 钢笔工具的使用
- OllyDebug破解第一个 CM 程序 《Acid burn.exe》
- 为什么会有视频号?朋友圈还不够吗?
- C++容器方法大汇总
- 音频频谱显示-基于fmod设计音乐播放器并动态显示频谱图(二)
热门文章
- 2019年了桌面CPU还吊打笔记本CPU?真相了
- django搭建个人博客(一)
- dos(cmd)命令
- 收藏:青春,最美!哈理工学子合唱《我的骄傲》(原唱杨培安)
- 拜登留学新政:美国读博直接拿绿卡,增加H1B签证限额!但未来留美门槛反而变高了?...
- matlab作业1,matlab作业报告一
- Self-attention中为什么softmax要除d_k
- “多源异构”和“异构同源”定义区分详解
- android html 布局设计工具,教你使用Android SDK布局优化工具layoutopt
- Linux shell 命令学习 大全