课上作业和课下作业
课上作业
第六周课上测试-2-ch02
任务要求
-
调用附图代码,编写一个程序 “week0602学号.c",用show_int(), show_float()打印一下你的4位学号,参考教材P33打印出匹配的位序列。
-
提交运行结果截图,要全屏,要包含自己的学号信息
-
参考教材p82,给出出匹配的位序列的推导过程
解决方式
1.书上是打印出int,float的16进制的数字,然后16进制的数字转化成2进制的数,两种2进制的数字有一部分是匹配的。
2.我自己的理解刚开始是错的,我将start[i]转变成2进制数然后存到一个数组里面,改变了函数的参数由
void show_bytes(byte_pointer start,size_t len)
变成了
void show_bytes(byte_pointer start,size_t len,int x[])
数组x用来保存2进制数,但是运行之后发现不对,之后发现start[i]应该是10进制的,我利用程序是将16进制的变成2进制的,所以错了。发现了错误以后不知道该怎么改正,因为%.2x是打印出的16进制数,实际上在内存里并没有这个显示出来的16进制数保存,就不知道该怎么解决这个问题。
第六周课上测试-3-ch02
任务要求
- 编写一个程序 “week0603学号.c",运行下面代码:
1 short int v = -学号后四位
2 unsigned short uv = (unsigned short) v
3 printf("v = %d, uv = %u ", v, uv);
- 在第三行设置断点用gdb调试,用p /x v; p /x uv 查看变量的值,提交调试结果截图,要全屏,要包含自己的学号信息
3 分析p /x v; p /x uv 与程序运行结果的不同和联系
解决方式
强制转换类型的结果保持位值不便,只是改变了解释这些位的方式
课下作业
ch02 课下作业1
任务要求
- 补充完成课上测试(不能只有截图,要有分析,问题解决过程,新学到的知识点)
- 完成教材 p97 2.96 2.97,要有完备的测试
- 发一篇相关内容的博客, 提交博客链接
解决方式2.96
1.关于什么是NaN上网查了一下,是Not a Number,其中有很多种,比如0.0/0.0或者负数开平方之类的。在我的程序里测试的是0.0/0.0。
2.如何判断一个数是否是NaN需要利用到一个函数和一个头文件<math.h>。函数是
int fpclassify(x):它用来查看浮点数x的情况,fpclassify可以用任何浮点数表达式作为参数,fpclassify的返回值有以下几种情况。
1.FP_NAN:x是一个“not a number”。
2.FP_INFINITE: x是正、负无穷。
3.FP_SUBNORMAL:x太小,以至于不能用浮点数的规格化形式表示。
4.FP_NORMAL: x是一个正常的浮点数(不是以上结果中的任何一种)。
解决方式2.97
在这题中我编写了几个辅助函数。
一个是阶乘的函数int RepMul(int a,int n)计算an
int RepMul(int a,int n)
{
int i,sum=1;
if(n==0)
return 1;
else
{
for(i=1;i<=n;i++)
{
sum=sum*a;
}
return sum;
}
}
一个是void shuzu(int a[])这个函数将数组a[]每次加一,遇到就2进位,用来便利232个浮点数。
void shuzu(int a[])
{
int flag=2,i,temp;
for(i=31;;i--)
{
temp=a[i];
if(i!=31)
a[i]=(a[i]+flag)%2;
else a[i]=(a[i]+1)%2;
if(temp+1==2)
flag=1;
else flag=0;
if(i<0||flag==0)
break;
}
}
一个是float xiaoshu(int n),用来计算小数部分的值。
float xiaoshu(int n)
{
float flag=1.0;
int i;
for(i=0;i<n;i++)
{
flag=flag/2;
}
return flag;
}
一个是void f(int a[]),用来实现232个32为的浮点数对应点float数值
void f(int a[])
{
int i,flag;
float sum=0.0,sum1=0.0,sum2=0.0;
for(i=0;i<32;i++)
{
a[i]=0;
}
while(1){
flag=1;
for(i=8;i>=1;i--)
{
sum1=sum1+(float)(a[i]*RepMul(2,i-8));
}
for(i=31;i>=9;i--)
{
sum2=sum2+(float)(a[i]*xiaoshu(i-8));
}
sum=sum1+sum2;
for(i=0;i<32;i++)
{
printf("%d",a[i]);
}
printf(" ");
printf("位级表示:%f
",sum);
shuzu(a);
for(i=0;i<32;i++)
{
if(a[i]!=1)
{
flag=0;
break;
}
}
if(flag==1)
break;
}
}
ch02 课下作业2
之后在自己的虚拟机里按步骤进行之后同样无法进行,并且虚拟机在之后就无法启动了,其他同学也是在自己虚拟机里弄得,也出现了同样的问题,最后都只能新建一个虚拟机。
在第二次完成时无视了这个错误,按照步骤进行,与实验楼里面的教程不同的是计算shellcode的数值这一步骤,实验楼是0xffffd1b0,而我是0xffffd020,加上100之后得到0xffffd084,之后按步骤进行可以成功