2017-2018-1 20155320第六周课堂实践总结
完善了一些课上交了但不够完善的测试并补交了课上没有完成的测试
第六周课上测试-2-ch02
调用附图代码,编写一个程序 “week0602学号.c",用show_int(), show_float()打印一下你的4位学号,参考教材P33打印出匹配的位序列。
提交运行结果截图,要全屏,要包含自己的学号信息
3.*************课下把代码推送到代码托管平台**************
- 参考教材p82,给出出匹配的位序列的推导过程
分析
通过学习课本P33与P82的代码及练习,我输入学号信息5320,依据输出得到的int 和 float型结果,将其转换为2进制,分析如下:
第六周课上测试-3-ch02
课上交的太慌了,交错了截图,以下为正确的截图
- 编写一个程序 “week0603学号.c",运行下面代码:
1 short int v = -学号后四位
2 unsigned short uv = (unsigned short) v
3 printf("v = %d, uv = %u\n ", v, uv);
- 在第三行设置断点用gdb调试,用p /x v; p /x uv 查看变量的值,提交调试结果截图,要全屏,要包含自己的学号信息
3 分析p /x v; p /x uv 与程序运行结果的不同和联系
分析
通过学习博客,对gdb内容进行了一下总结:
1.条件断点:b fxx(函数名)
2.条件断点:b 12 if i=5000
行断点:b 行号
4.临时断点:tb 行号
5.还可以通过p 变量在调试过程中来查看变量的值
p/x xx 是用16进制查看,首先b 5 设置行断点,然后r 运行至行断点,使用p/x 查看v、uv的值。结果与运行出来的结果比较截图如下
不同:可看出用p/x查看得到的v和uv值是一样的,而直接运行得到的结果v=-5320,uv=60216
联系:
在书中P49页有提到产生这种原因的解释,将short强制类型转换为unsigned short 改变数值,但是不改变位的表示,所以16进制查看时v与uv的结果相同,但是运行出来的结果不同。
第六周课上测试-4-ch03
1 通过输入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 函数的汇编代码截图,图中用矩形标出函数栈帧的形成和销毁的代码
分析:
我学习了一下课本3.7章的内容,并查阅了博客函数栈帧的创建与销毁得到如下图所示结果:
第六周课上测试-5-ch03
1 通过输入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)的值和栈的变化情况。提交照片,要有学号信息。
分析
参考博客GDB调试汇编堆栈过程分析
1.输入disassemble 调出对应的汇编代码,disassemble指令获取汇编代码,用i(info) r(registers)指令查看各寄存器的值
2.并重复si-->i r-->x/a 寄存器(地址)
disassemble指令获取汇编代码,用i(info) r(registers)指令查看各寄存器的值
3.经过分析得到如下变化情况
. 完成教材 p97 2.96 2.97,要有完备的测试
2.96 编写的函数float_f2i(float_bits f);是用来实现float型转换为int型
测试结果为:
2.97
目前还不会,和同学们讨论了一下仍然无法理解,希望老师讲解一下