1.
要求
参考附图代码,编写一个程序 “week0601学号.c",判断一下你的电脑是大端还是小端。
代码调试中的问题及解决方法
- 问题:
一开始我是通过运行课本上的代码与课本上大端机器出现的结果进行对比,判断我的电脑是大端还是小端。 - 解决方法: 经过老师提醒后,我意识到可以直接看地址首位的数字来判断机器是大端还是小端。代码如下:
int main()
{
int i = 0x12345678;
char *m;
m=(char *)&i;
if(*m==0x78)
printf("学号20155315的笔记本电脑是小端\n");
else printf("学号20155315的笔记本电脑是大端\n");
}
运行结果
2.
要求
调用附图代码,编写一个程序 “week0602学号.c",用show_int(), show_float()打印一下你的4位学号,参考教材P33打印出匹配的位序列。
代码调试中的问题及解决方法
- 问题:
运行程序后,分别得到浮点型和整数型的8位16进制表示,但是将其化成二进制后,发现怎么都找不到匹配序列。 解决方法: 算不出结果的时候,突然想到我的电脑是小端机器,因此,如果要将其转化为二进制,就应从后往前转换。果然,改变位置之后,我得到匹配序列为1010011000011
运行结果
3.
要求
- 编写一个程序 “week0603学号.c",运行下面代码:
short int v = -学号后四位
unsigned short uv = (unsigned short) v
printf("v = %d, uv = %u\n ", v, uv);
- 在第三行设置断点用gdb调试,用p /x v; p /x uv 查看变量的值,
- 分析
p /x v
、p /x uv
与程序运行结果的不同和联系
代码调试中的问题及解决方法
- 问题:
一开始,我按着老师给的要求一步步调试代码,但是在调试完成之后,我不是很懂p/x是什么意思。 - 解决方法:查找资料,知道了
p\参数
的意思是用参数所代表的进制或格式查看变量的值:
命令 | 含义 |
---|---|
p/x或p/a | 用16进制查看变量的值 |
p/o | 用8进制查看变量的值 |
p/d | 用10进制查看变量的值 |
p/t | 用2进制查看变量的值 |
p/f | 用浮点数打印变量的值 |
p/c | 用字符打印变量的值 |
运行结果
对结果的思考
一开始定义的-5315是有符号数,二进制表示下,最高位的“1”不计入数值;将其强制转换为无符号数之后,最高位的“1”计入数值,显示的结果是68221,但是事实上,二进制表示并没有发生改变,因此使用“p/x”查看的时候,v和uv的结果是一样的。
4.
要求
通过输入gcc -S -o main.s main.c 将下面c程序”week0603学号.c“编译成汇编代码
int g(int x){
return x+3;
}
int f(int x){
int i = 学号后两位;
return g(x)+i;
}
int main(void){
return f(8)+1;
}
- 删除汇编代码中 . 开关的代码,提交f 函数的汇编代码截图,图中用矩形标出函数栈帧的形成和销毁的代码
运行结果
5.
要求
通过输入gcc -S -o main.s main.c 将下面c程序”week0603学号.c“编译成汇编代码
int g(int x){
return x+3;
}
int f(int x){
int i = 学号后两位;
return g(x)+i;
}
int main(void){
return f(8)+1;
}参考http://www.cnblogs.com/lxm20145215----/p/5982554.html,使用gdb跟踪汇编代码,在纸上画出f中每一条语句引起的eip(rip),ebp(rbp),esp(rsb),eax(rax)的值和栈的变化情况。提交照片,要有学号信息。
计算结果
6.ch02 课下作业
要求
遇到的问题
在编译2.97的代码的时候,发现并不清楚什么是浮点数的位级表示,查找资料之后,发现还是一知半解,希望老师上课能讲解一下,加深我们的理解。
运行结果
7.ch03 课下作业
要求
在自己的电脑中完成https://www.shiyanlou.com/courses/231缓冲区溢出漏洞实验
遇到的问题
题目要求在自己的电脑中完成,但是我的虚拟机在下载32位包的时候有问题,后面的步骤也执行不了,因此在实验楼上完成本次实验。
运行结果
感受
这次课堂测试让我觉得很吃力,课下也花费了很多时间,但还是觉得有很多知识都不是很懂。实践有时是运行书上的代码,有时是运行自己编的代码,但是每一周的功课量都很大,学习效率特别低。
参考资料
一步一步学调试