csapp-lab1-DataLab
写在前面
之前考研的时候csapp有刷过5,6遍但是一直没有做过实验,最近在学c++的时候准备重新刷一下大名鼎鼎的csapp实验。
0. 环境准备
最好准备一个纯净的Linux系统这里建议使用docker
构建一个centos
或者 ubuntu
系统
-
实验资料的下载
-
docker上的环境搭建
-
拉取
centos
系统docker pull centos
-
建立目录挂载实现文件同步
docker container run -it -v /Users/xxxx/yourFilePath:/csapp --name=csapp_env centos /bin/bash
-
配置编译环境
-
更新yum源
yum -y update
-
安装
sudo
yum install sudo
-
安装c/c++编译环境
yum install make automake gcc gcc-c++ kernel-devel
-
安装gdb
yum install gdb
-
准备32位嵌入式c库
yum install glibc-devel.i686
-
-
阅读
readme
完成配置这里需要先进入刚才映射的文件目录
csapp
文件然后参考readme
文件To compile and run the btest program, type: unix> make btest unix> ./btest [optional cmd line args]
完成上面的操作之后我们的配置就算完成了。
接下来我们可以在本机的编译器编写我们的代码。然后在docer中的虚拟容器上编译和运行我们的代码。✅
在编译器中编写
在docker容器中编译和运行
蓝色箭头为编译。红色箭头为运行
注意:每次更改bits.c文件后都要重新编译btest。如果需要检查单个函数的正确性,可以使用-f标志:
$ ./btest -f bitXor
dlc
程序可以检测我们有没有违规,如果运行没有输出则没有问题
$ ./dlc bits.c
注意每次关闭docker在下一次运行的时候需要先启动我们的centos。
- 先找到我们命名为
csapp_env
容器的容器id
- 然后
docker start
容器ID启动我们的容器 - 输入以下命令进入到这个运行中的容器
docker exec -it 容器id /bin/bash
1. 实验开始
* IMPORTANT. TO AVOID GRADING SURPRISES:
* 1. Use the dlc compiler to check that your solutions conform
* to the coding rules.
* 2. Use the BDD checker to formally verify that your solutions produce
* the correct answers.
*/
1.1 bitXor
a^b=
1.(a|b)&(~a|~b)
2.~(~a&~b)&~(a&b)
3.(a&~b)|(~a&b)
可以用这三种方式表示异或操作,具体的推导可以自行Google,参考离散数学我自己推了一下发现其实不难
主要是对德摩根律的应用
我们选择第二种操作即可过掉本例
int bitXor(int x, int y) {
return ~(~x&~y)&~(x&y);
}
1.2 tmin
int tmin(void) {
return 1<<31;
}
1.3 tmax
题目描述
* isTmax - returns 1 if x is the maximum, two's complement number,
* and 0 otherwise
* Legal ops: ! ~ & ^ | +
* Max ops: 10
* Rating: 1
*/
思路
我们考虑四位的最大值x=0111
然后x+1之后就会变成1000
我们对1000
取非 0111
就会重新变回x值
这里要是可以用等于是不是直接完成了,但是不能用等于,在这可以用一个位运算的小技巧,我们知道自己与自己异或会得到0,也就是说我们可以用异或来判断等于!((~(x+1)^x))
判断这个是否为1即可判断是否为最大值
这里有一个例外就是x=-1
由于-1=1111
他利用上面的式子判断也符合,故要特判-1 利用!!(x+1)
这个操作-1和最大值并不相同
int isTmax(int x) {
return !((~(x+1)^x))&!!(x+1);
}