西工大网络空间安全学院计算机系统基础实验一(123)

news2024/12/23 11:08:30

在实验零中,我们拿到了lab1-handout.zip压缩文件,接着,我们使用unzip ./lab1-handout.zip命令,解压缩该压缩文件。解压缩成功后,使用"ls"命令查看当前工作目录下的文件和文件夹,发现得到了"lab1-handout"文件夹,如(图1:解压缩实验一文件)所示。在这里注意,zip格式的压缩文件常用于Windows系统,在Linux系统中很少用到(Ubuntu系统是Linux系统的一种,其它Linux系统还有很多,比如CentOS7, CentOS8 Stream, OpenSUSE, Fedora, Ubuntu, Debian等,以及大三上做网络空间安全攻防实验时,会用到专门用做网络攻击的Kali系统,以及国外的网络安全网站Try Hacke Me专门推出的Parrot系统,还有Redhat推出的RHEL系统,都属于Linux系统。在这里不要贪多,专精一种系统就可以。我一直选择的是CentOS8 Stream系统,因为它受Redhat支持,而Redhat是很知名的Linux解决方案提供商)Linux系统中常用的压缩文件格式一般为什么什么.tar.gz,而解压缩这些压缩文件的方法为"tar xzvf 什么什么.tar.gz"。在这里你不需要知道'tar'命令是干什么的,你也不需要知道'xzvf'四个参数分别都是做什么用的,你现在只需要记住这条命令即可,后续会讲到'tar'命令以及'xzvf'四个参数。

**************************************************************************************************************

(图1:解压缩实验一文件)

**************************************************************************************************************

解压缩该.zip文件之后,使用'cd'命令进入到该文件夹中, 然后使用'ls'命令查看该文件夹中的内容,发现有很多很多很多文件,无从下手,如(图2:实验一文件夹中的很多文件)所示。但是注意到其中包含一份README文件。注意!当我们拿到一份开源软件文件夹时,需要做的第一件事,就是去看它的README文件,了解这份开源软件是做什么用的、它的内部组成是什么、每份文件的用途是什么、该如何编译它、该如何使用它、各个选项及参数该如何使用等,而不是直接去看自己熟悉的.c文件。使用cat README命令,即可以读取README文件的内容。同样如果有一份名为1.txt的文件,使用cat 1.txt可以读取1.txt的内容;如果有一份名为2.txt的文件,可以使用cat 2.txt读取2.txt的内容;如果有一份名为3.txt的文件,可以使用cat 3.txt读取3.txt的内容......但是考虑到使用cat命令阅读README文件是困难的,我们选择使用'less README'命令来阅读README文件。如(图3:使用less命令阅读README文件)所示。在使用less命令阅读README文件时,按下”上“键即可阅读上面一行,按下”下“键即可阅读下面一行,按下"Pg up"键即可向上翻页,按下"Pg down"键即可向下翻页,按下’Q‘键即可结束阅读。注意,即使README文件是英文,也不要害怕读它,耐下性子慢慢读,千万千万不要着急,就能读懂。

**************************************************************************************************************

(图2:实验一文件夹中的很多文件)

**************************************************************************************************************

**************************************************************************************************************

(图3:使用less命令阅读README文件)

************************************************************************************************************** 

 大概阅读完成README文件之后,我们知道我们只需要修改一个文件的内容,其余文件的内容都不需要修改,而这个文件的名称就是"bits.c"。虽然README文件中还有很多很多内容,但是我们不要着急,一条一条慢慢看,耐下性子慢慢看,最终一定能做出来哒。保证当前目录就是包含有bits.c文件的目录(使用ls命令查看当前文件夹下的所有文件,使用cd命令进入一个文件夹,使用pwd命令显示出当前所在的文件夹),然后使用"less bits.c"命令,查看bits.c文件的内容,如(图4:使用less命令查看bits.c文件的内容)所示。

**************************************************************************************************************

(图4:使用less命令查看bits.c文件的内容)

************************************************************************************************************** 

首先我们看到了一大段注释,如(图5:bits.c文件开头的一段注释)所示。这段注释对我们唯一有用的信息是,不要在文件中写入"#include<stdio.h>"这条语句,即使会使用"printf()"函数用来帮助写程序改错,也不要引入"#include<stdio.h>"这条语句。即使程序会给出警告,说必须先声明printf(),才能够再使用printf()。(因为如果不包含stdio.h头文件,就直接使用printf函数,则编译器不会知道printf()函数的具体原型,所以编译器会发出警告)这就引入了第1个要点:不要使用"#include <stdio.h>"。

**************************************************************************************************************

(图5:bits.c文件开头的一段注释)

**************************************************************************************************************

接下来是阅读步骤一。它针对整型数和浮点数,分别制定了整型数编码规则和浮点数编码规则。总结出来即为两个要点。接着要点1:不要使用"#include <stdio.h>",我们可以得到要点2与要点3:

要点2:对于整型数,只能使用& ^ | + << >> ! ~这八个运算符,只能定义并使用int型的局部变量以及函数参数变量,只能使用0x0到0xFF的int型常量;

要点3:对于浮点数,只能使用& ^ | + << >> ! ~这八个运算符,可以定义并使用int型或unsigned int型的局部变量以及函数参数变量,可以使用任意有符号整型与无符号整型常量,可以使用循环与条件判断。

如(图6:阅读步骤一时的一个小部分)所示,即使看起来很多,但其实浓缩下来,只有要点2与要点3,所以不需要因为自己C语言基础不好而感觉到害怕,大胆继续往下走就可以。

**************************************************************************************************************

(图6:阅读步骤一时的一个小部分)

**************************************************************************************************************

因为使用命令"less bits.c"来阅读bits.c文件时,没有显示出来行号,不利于阅读,所以我们使用命令"cat -n bits.c | less"来阅读bits.c文件,"cat -n bits.c"中的选项"-n"表示显示出来行号,"cat -n bits.c | less"表示可以翻页得去阅读bits.c文件,而不是一下子展示出来。如(图7:"cat -n bits.c | less")所示。我们定位到第169行,准备编写第一个函数tmin,如(图8:第一个函数tmin)所示。

**************************************************************************************************************

(图7:"cat -n bits.c | less")

**************************************************************************************************************

**************************************************************************************************************

(图8:第一个函数tmin)

**************************************************************************************************************

在包含Ubuntu系统在内的所有Linux系统中修改一个文本文件的内容的方法有很多,我习惯使用命令行vim工具(对于运维人员来说,vim工具是最简单最高效的工具,即使在没有开启图形化界面的情况下,也可以使用vim工具来编辑文本文件),但是考虑到vim工具用法有些复杂,而且现在时间紧迫,下周就要交,所以选择使用VS code。 在大一上的寒假,可以去学习vim工具的使用。用VS code打开bits.c文件,如(图9:用VS code打开bits.c文件)所示。

**************************************************************************************************************

(图9:用VS code打开bits.c文件)

**************************************************************************************************************

通过使用VS code工具浏览bits.c文件,我们了解到,我们一共需要编写15个函数,下面我们一个接一个慢慢编写:

第一个函数int tmin(void),要求返回最小的用补码形式表示的有符号整数。而最小的用补码形式表示的有符号整数即为0x8000 0000,但是如果简单的"return 0x80000000",程序将会报错,为什么呢?因为根据要点2,对于整型数来说,只能使用0x0到0xFF的int型常量。那么我们可以怎么做呢?不妨考虑考虑0x80与0x8000 0000之间的关系,发现"0x80<<24"的结果,不就是0x80000000嘛?而且我们使用python验证我们的推断(图10:使用python验证0x80<<24=0x80000000),发现我们的推断是正确的。所以我们只修改bits.c中的第176行,注意,只修改了第176行!!!,如(图11:第1个函数——修改bits.c中的第176行)所示。接着保存并退出VS code。

**************************************************************************************************************

(图10:使用python验证0x80<<24=0x80000000)

************************************************************************************************************** 

**************************************************************************************************************

(图11:第1个函数——修改bits.c中的第176行)

************************************************************************************************************** 

接着按照README中的指示,使用实验一文件夹中自带的"dlc"文件检查bits.c文件中我们所写的tmin函数是否满足对于运算符等的要求。但是因为dlc文件默认是没有可执行权限的,所以我们需要使用命令"chmod u+x dlc",使得dlc对于拥有者来说,具有可执行权限。"chmod"表示修改文件或者文件夹的权限,"u+x" 表示对于user拥有者来说,增加一个"x"权限,"x"权限即为可执行权限。接着按照README中给出的样例,键入命令"./dlc bits.c",发现没有任何输出。而根据README的指示,如果没有任何输出,就证明bits.c文件中我们所写的tmin函数满足对于运算符等的要求。键入命令"./dlc -e bits.c",统计每个函数中所使用到的运算符的个数,发现我们所写的第一个函数只使用了1个运算符。如(图12:第1个函数——首先检查tmin函数是否满足对于运算符等的要求)所示。

**************************************************************************************************************

(图12:第1个函数——首先检查tmin函数是否满足对于运算符等的要求)

**************************************************************************************************************

接着按照README中的指示,使用"make btest"命令编译文件,忽略出现的警告(虽然在C语言课上,老师要求大家不要留下任何一个警告,要努力去修改好它,但是考虑到这种修改好这种警告的办法比较复杂,所以既然它不影响程序的执行,那么我们可以简单的忽略掉它),并且使用"./btest -f tmin" 命令检查名为"tmin"的函数是否正确,选项"-f"指定了被检查的文件的名称为"tmin"。根据命令"./btest -f tmin" 的结果,发现没有错误,所以认为第1个函数"tmin"做完了。如(图13:第1个函数——接着检查tmin函数能否输出正确的结果)所示。

**************************************************************************************************************

(图13:第1个函数——接着检查tmin函数能否输出正确的结果)

**************************************************************************************************************

接着第2个函数, "int absVal(int x)",要求给出有符号整型变量x的绝对值。我们来分析,如果是正数或者0的话,其16进制表示必将小于0x8000 0000,这时直接返回x就可以。比如x=0x1234 5678,那就可以只需返回0x1234 5678而如果是负数的话,比如-2,其16进制表示形式即为0xFFFF FFFE,这时我们该怎么做,才能够让0xFFFF FFFE变为0x0000 0002呢?发现0xFFFF FFFE各位取反(~),之后再加1,即可得到0x0000 0002,这时需要返回~x+1(不需要加括号的原因是,按位取反~的优先级大于+,如(图14:C语言中各运算符的优先级)所示)。那么如何将这两种情况结合在一起呢?(毕竟根据要点2,整型数的相关规则规定,不允许使用条件判断)只好通过判断最高位,也就是通过判断符号位,来确定该返回x呢,还是该返回~x+1。可以利用flag=((0x1<<31)&x)>>31来判断符号位,如果x是正数,则0x1<<31=0x8000 0000,(0x1<<31)&x=0x0000 0000,((0x1<<31)&x)>>31=0x0000 0000;如果x是负数,则0x1<<31=0x8000 0000,(0x1<<31)&x=0x8000 0000,((0x1<<31)&x)>>31=0xFFFF FFFF(根据README,已经说明右移为算术右移,即最高位是1,则右移31位后结果为0xFFFF FFFF)。最后返回flag&(~x+1)|~flag&x(这里不需要加括号,因为&的优先级大于|),如果x是正数,flag为0x0,则flag&(~x+1)的结果也为0,~flag为0xFFFF FFFF,~flag&x的结果为x,flag&(~x+1)|~flag&x返回x;如果x是负数,flag为0xFFFF FFFF,flag&(~x+1)的结果为~x+1,~flag为0x0,~flag&x为0,flag&(~x+1)|~flag&x返回~x+1(作者实在想不出更好的解决方法了)。只修改bits.c的第187行,如(图15:第2个函数——修改bits.c中的第187行)所示,保存VS code。接着按照README中的指示,使用命令"./dlc -e bits.c"判断函数absVal是否满足对于运算符等的要求,如(图16:第2个函数——首先检查absVal函数是否满足对于运算符等的要求)所示,发现编译成功,即使有两个警告(这两个警告可以被忽略掉,因为这个警告是害怕我们搞混|与&的优先级)。接着按照README中的指示,先后使用"make clean"与"make btest"命令(作者也不知道这两个命令是做什么用的,等到后面有时间了,可以再慢慢研究),再使用命令"./btest -f absVal"检查absVal函数能否产生正确的结果。如(图17:第2个函数——接着检查absVal函数能否输出正确的结果)所示,成功。

**************************************************************************************************************

(图14:C语言中各运算符的优先级)

**************************************************************************************************************

************************************************************************************************************** 

(图15:第2个函数——修改bits.c中的第187行) 

**************************************************************************************************************

**************************************************************************************************************

(图16:第2个函数——首先检查absVal函数是否满足对于运算符等的要求) 

**************************************************************************************************************

**************************************************************************************************************

(图17:第2个函数——接着检查absVal函数能否输出正确的结果)

**************************************************************************************************************

 接着第3个函数,int bitAnd(int x, int y),只使用~与|两个运算符,实现x&y。从最简单的方法开始,0&0=0, 0&1=0, 1&0=0, 1&1=1,如何只使用~与|来实现x&y呢?很容易发现,0|0=0, 0|1=1, 1|0=1, 1|1=1,把这四个新的式子调换顺序,即1|1=1, 1|0=1, 0|1=1, 0|0=0,即(~0)|(~0)=1, (~0)|(~1)=1, (~1)|(~0)=1, (~1)|(~1)=0, 进而~((~0)|(~0))=0, ~((~0)|(~1))=0, ~((~1)|(~0))=0, ~((~1)|(~1))=1。所以我们猜测,x&y=~(~x|~y)。使用Python验证想法。如(图18:第3个函数——用Python验证想法)所示,我们的想法是正确的。重复与第1、2个函数相同的做法,如(图19:第3个函数) 所示,第3个函数成功。

**************************************************************************************************************

(图18:第3个函数——用Python验证想法)

**************************************************************************************************************

**************************************************************************************************************

(图19:第3个函数) 

************************************************************************************************************** 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1262980.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

移动硬盘里的东西误删怎么恢复?这种方法你试过了吗?

在日常生活中&#xff0c;我们经常会使用移动硬盘来存储大量的东西&#xff0c;如工作资料、电影、照片、表格等。然而&#xff0c;有时候我们会不小心删除了移动硬盘里的重要文件。这时候&#xff0c;恢复这些误删的文件就显得尤为重要。本文将介绍实用的方法&#xff0c;帮助…

图片照片编辑SDK解决方案

图像和照片已经成为我们日常生活中不可或缺的一部分&#xff0c;无论是个人还是企业&#xff0c;都希望通过高质量的图像和照片来提升品牌形象&#xff0c;吸引更多的用户和客户。然而&#xff0c;图像和照片的编辑并不是一件简单的事情&#xff0c;它需要专业的技术和工具。这…

Spring的创建

文章目录 前言 一、创建一个Maven项目 二、添加spring框架支持 2.1在项目的pom.xml添加spring框架支持&#xff0c;xml配置如下  2.2添加包 总结 前言 我们通常所说的 Spring 指的是 Spring Framework&#xff08;Spring 框架&#xff09;&#xff0c;它是⼀个开源框架&a…

使用nvm管理node多版本

win10环境使用nvm安装管理多版本nodejs 使用node工程&#xff0c;有时不同项目需要使用不同node版本&#xff0c;来回安装肯定是很麻烦的&#xff0c;所以需要一个方法能够使电脑系统安装多个node版本&#xff0c;并且使用一句命令就能自由切换。 nvm安装 1.nvm安装&#xff0c…

6.一维数组——用冒泡法,选择法将5个整数由大到小排序

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码&#xff08;冒泡法&#xff09;程序运行代码&#xff08;选择法&#xff09; 前言 本系列为一维数组编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 用冒泡法将5个整数由大到小排序 二、题目…

文心一言 VS 讯飞星火 VS chatgpt (145)-- 算法导论12.1 5题

五、用go语言&#xff0c;因为在基于比较的排序模型中&#xff0c;完成n个元素的排序&#xff0c;其最坏情况下需要 Ω(nlgn) 时间。试证明:任何基于比较的算法从 n 个元素的任意序列中构造一棵二又搜索树&#xff0c;其最坏情况下需要 Ω(nlgn) 的时间。 我个人喜欢 灵小智 。…

JOSEF 可调漏电继电器 RT-L1KS φ25mm 导轨或面板安装

RT-L系列可调漏电继电器&#xff08;以下简称继电器&#xff09;适用于交流电压至690V&#xff0c;频率为50Hz&#xff0c;电流至1500A及以下漏电继电器中性点接地电路中。 RT-L系列可调型漏电继电器 RT-L1K可调型漏电继电器 RT-L2K可调型漏电继电器 RT-L3K可调型漏电继电器…

云计算——ACA学习 阿里云云计算服务概述

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 目录 写在前面 前期回顾 本期介绍 前言了解 一…

前端代码提交gitlab出现语法错误无法提交

错误 找到项目里面的.git文件夹 下面有一个hooks 删除pre-commit文件&#xff08;git语法校验代码&#xff09;

微信h5页面video播放标签设置了预览图后 ios手机打开页面 有声音但是预览图没有消失

微信h5页面video播放标签设置了预览图后 ios手机打开页面 有声音但是预览图没有消失问题&#xff0c;安卓没有此问题&#xff1f; 解决办法&#xff1a; src 属性要在video 标签和source标签都写上 问题解决

resty-http库爬虫程序代码示例

lua -- 导入需要的库 local http require "resty.http" local io require "io" -- 创建一个客户端 local client http.new() -- 设置HTTP客户端的 client:set_proxy(proxy_host, proxy_port) -- 执行HTTP GET请求&#xff0c;获取网页内容 local res…

windows10 Arcgis pro3.0-3.1

我先安装的arcgis pro3.0&#xff0c;然后下载的3.1。 3.0里面有pro、help、sdk、还有一些补丁包根据个人情况安装。 3.1里面也是这些。 下载 正版试用最新的 ArcGIS Pro 21 天教程&#xff0c;仅需五步&#xff01;-地理信息云 (giscloud.com.cn) 1、安装windowsdesktop-…

多个nginx共享值、缓存问题

背景 目前我在集成登录认证功能&#xff08;cas&#xff09;&#xff0c;使用的架构是nginxlua&#xff0c;由于我们有多个系统&#xff08;全是前端项目&#xff09;&#xff0c;每套系统都采用nginxlua的方式进行部署&#xff08;即每个系统都是一个nginx&#xff09;&#…

docker容器运维操作命令

docker exec &#xff1a;在运行的容器中执行命令 docker exec [OPTIONS] CONTAINER COMMAND [ARG...] OPTIONS说明&#xff1a; -d :分离模式: 在后台运行 -i :即使没有附加也保持STDIN 打开 -t :分配一个伪终端docker ps : 列出容器 docker ps [OPTIONS] OPTIONS说明&#…

PHP中关于func_get_args()方法

首先呢这个函数出现的是比较早的,大致应该是PHP4出现的, func_get_args — 返回一个包含函数参数列表的数组 说明 func_get_args(): array 获取函数参数列表的数组。 该函数可以配合 func_get_arg() 和 func_num_args() 一起使用&#xff0c;从而使得用户自定义函数可以接…

统计学中两组数据如何进行差异性(相关性)分析?

变量说明&#xff1a; 在确定分析方法前&#xff0c;我们需要了解手中的数据类型&#xff0c;这是最基础也是有必要的&#xff0c;在所有的数据类型中&#xff0c;我们将数据类型分为分类变量也为定类变量和连续变量也称为定量变量&#xff0c;那么什么是定类变量&#xff1f;…

2023年国赛试题:配置inux1 为 CA 服务器

试题内容:配置 linux1 为 CA 服务器,为 linux 主机颁发证书。证书颁发机构有 效期 10 年,公用名为 linux1.skills.lan。申请并颁发一张供 linux 服务器使用的证书,证书信息:有效期 =5 年,公用名=skills.lan, 国家=CN,省=Beijing,城市=Beijing,组织=skills,组织单位…

立即修复计算机显示msvcp110.dll丢失问题!4个快速解决方法大揭秘

在计算机使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“msvcp110.dll丢失”。这个错误通常会导致某些程序无法正常运行&#xff0c;给用户带来诸多不便。那么&#xff0c;当我们遇到这个问题时&#xff0c;应该如何进行修复呢&#xff1f;本文将…

Kafka生产者发送消息的流程

Kafka 生产者发送消息的流程涉及多个步骤&#xff0c;从消息的创建到成功存储在 Kafka 集群中。以下是 Kafka 生产者发送消息的主要步骤&#xff1a; 1. 创建消息 生产者首先创建一个消息&#xff0c;消息通常包含一个键&#xff08;可选&#xff09;和一个值&#xff0c;以及…

3D打印报价系统

一款3d打印报价系统不仅可以展示三维模型&#xff0c;还能自动计算模型的相关信息&#xff0c;如面积、体积和尺寸信息。 用户上传三维模型后&#xff0c;系统会自动为其生成一个报价页面。在这个页面上&#xff0c;用户可以看到他们模型的所有相关信息&#xff0c;包括面积、体…