要求

  1. 补充完成课上测试(不能只有截图,要有分析,问题解决过程,新学到的知识点)
  2. 完成教材 p97 2.96 2.97,要有完备的测试
  3. 发一篇相关内容的博客, 提交博客链接

课上测试

2.

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

  2. 提交运行结果截图,要全屏,要包含自己的学号信息

3.*************课下把代码推送到代码托管平台**************
4. 参考教材p82,给出出匹配的位序列的推导过程

问题分析

根据给出的两段代码

按照题目要求只需要用show_int(),show_float()打印,因此删去show_pointer()部分代码,再加上一段输入学号的代码就行了。代码如下

#include<stdio.h>
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start,size_t len){
size_t i;
for(i=0;i<len;i++)
printf("%.2x",start[i]);
printf("\n");
}
void show_int(int x){
show_bytes((byte_pointer) &x,sizeof(int));
}
void show_float(float x){
show_bytes((byte_pointer) &x,sizeof(float));
}
void text_show_bytes(int val){
int ival=val;
float fval=(float)ival;
show_int(ival);
show_float(fval);
}
int main(int argc,char *argv[]){
text_show_bytes(5327);
return 0;
}

问题解决过程以及学到知识点

在课上进行实践的时候在输入学号上出现了问题,我直接在主函数中加了一段输入

后来查阅资料知道了输入需要用命令行输入。

3.

  1. 编写一个程序 “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 与程序运行结果的不同和联系

问题分析

  • 代码根据题目要求直接写出就好
#include<stdio.h>
void main(){
    short int v = 5327;
    unsigned short uv = (unsigned short) v;
    printf("v = %d,  uv = %u\n ", v, uv);
}
  • gdb调试
    gcc中-g选项是为了获得有关调试信息,要用gdb进行调试,必须使用-g生成二进制可执行文件
    gcc -g week060320155327.c 

b (line number):设置行断点
run:运行
p:print
/x:十六进制

问题解决过程以及学到知识点

由于基础过于薄弱,第一二题耽误了太多时间导致第三题还没做完就结束了

4.

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. 删除汇编代码中 . 开关的代码,提交f 函数的汇编代码截图,图中用矩形标出函数栈帧的形成和销毁的代码

分析

按照题目要求进行即可

问题解决过程,新学到的知识点

在编译运行时出现了问题

在网上查阅资料后发现是:
UTF-8编码问题。UTF-8编码有BOM和无BOM格式。BOM,ByteOrderMark(字节标记顺序),表明使用UTF8来进行编码。UTF-8的BOM通常为3个字节EF BB BF。转换成对应的字符查看,就是‘\357’,‘\274’,‘\233’。
简单来说就是输入了中文的标点符号,修改之后终于成功了。

5.

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)的值和栈的变化情况。提交照片,要有学号信息。
 posted on 2017-10-29 23:12  20155327李百乾-  阅读(163)  评论(0编辑  收藏  举报