作业补交

作业补交

课堂测试二

编写一个程序 “week0602学号.c",用show_int(), show_float()打印一下你的4位学号,参考教材P33打印出匹配的位序列。

遇到的问题

1.返回值的类型定义错误;

如图:

解决:在主函数前加上int

课堂测试三

编写一个程序 “week0603学号.c",运行下面代码:

1 short int v = -学号后四位

2 unsigned short uv = (unsigned short) v

3 printf("v = %d, uv = %u\n ", v, uv);

  1. 在第三行设置断点用gdb调试,用p /x v; p /x uv 查看变量的值,提交调试结果截图,要全屏,要包含自己的学号信息

3 分析p /x v; p /x uv 与程序运行结果的不同和联系

遇到的问题:

问题:在GDB调试过程中,一开始将断点设置在第四行,运行的结果输出不是我的学号,而是0;

解决:最后发现我设置断点太早,导致运行在赋值之前,就导致了赋值结果为0;所以我将断点设置在第六行,结果为十六进制的

课堂实验三

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;
}

  1. 参考http://www.cnblogs.com/lxm20145215----/p/5982554.html,使用gdb跟踪汇编代码,在纸上画出f中每一条语句引起的eip(rip),ebp(rbp),esp(rsb),eax(rax)的值和栈的变化情况。提交照片,要有学号信息。

在编译过程中遇到了很多的问题,比如输入gcc - g example.c -o example -m32会显示fatal error: sys/cdefs.h: No such file or directory,查了资料以后说没有环境需要输命令下载sudo apt-get install libc6-dev-i386,

步骤

  • gcc -g week06055239.c -o week06055239 -m32编译程序
  • gdb week06055239进入gdb模式
  • 设置断点在main函数调用f函数的位置gdb> b 10
  • gdb> run运行
  • gdb> disassemble反汇编
  • display /i $pc
  • i r
  • x查看内存中的内容
  • si执行下一条汇编

posted on 2017-10-29 20:25  吕宇轩  阅读(270)  评论(0编辑  收藏  举报