2017-2018-1 20155336 《信息安全系统设计基础》第八周课堂测试

1.求命令行传入整数参数的和

解答:

  • 编写代码

      #include <stdio.h>
      void main(int argc,char** argv)
      {
      int i,a,sum=0;
      for(i=1;i<argc;i++)
      {
      a=atoi(argv[i]);
      sum = sum +a;
      }
      printf("%d\n",sum);
      }
    

代码调试中的问题及解决方法

  • 问题就是粗心,没有注意到是二维数组,然后怎么编译都没用通过,浪费了很多时间。
  • 解决方法就是./a.out 的后面的学号写成两个数字就可以啦!

运行结果

2.汇编

  • 把第一个练习中的代码在X86-64(Ubuntu)中反汇编,给出汇编代码和机器码的截图

  • 把X86-64汇编翻译成Y86-64汇编,并给出相应机器码的截图(使用附件中的Y86-64模拟器)

代码调试中的问题及解决方法

  • 问题一: 在安装Y86的时候出现了这个问题

  • 解决:通过输入命令sudo rm /var/cache/apt/archives/locksudo rm /var/lib/dpkg/lock,以及sudo rm /var/lib/dpkg/lock之后成功解除占用。

运行结果

  • X86-64汇编代码

  • X86-64机器码

3.实现daytime

  • 基于socket 使用教材的csapp.h csapp.c,实现daytime(13)服务器(端口我们使用13+后三位学号)和客户端

  • 服务器响应消息格式是

      客户端IP:XXXX
      服务器实现者学号:XXXXXXXX
      当前时间: XX:XX:XX
    
  • 运行结果

  • 问题:是由于csapp.c 未被导入导致的。将cssap.c和csapp.h导入到了include文件夹和lib文件夹下。将csapp.c导入客户端和服务器的代码所在的文件夹下,将csapp.c一起编译就可以了。

课下测试1

  • 1 完成家庭作业4.47,4.48,4.49
  • 2 相应代码反汇编成X86-64汇编
  • 3 把上述X86-64汇编翻译成Y86汇编,并给出相应机器码

4.47

解题思路:

  • 将题目所给的数组元素代码转换成指针索引的代码

具体方法为:将指针赋给数组的头地址,然后按位移动指代

	C格式:int *data=a;

	*(data+i);
  • 将所得的C程序汇编一下获得相应的汇编代码

  • gcc -S .c -o

  • 去掉相应的“.”

  • 将所得的Y86代码与用机器产生的反汇编代码比对,验证准确性

解题过程:

对比及修改


注意事项

  • 对应的指针代码要在能运行与检测的基础上构建,在调用相应的冒泡程序时,因先利用GCC -G后调试一下。不然的话在没有可执行的程序做保证的话会由于书写错误或者指代错误等错误因素导致数据意外存储而没有报错,这样无法得到汇编及正确的代码
  • 在可执行的C代码汇编版本中:movl指令对应的Y86指令有三个,要注意区分三者后带的参数类型
  • Y86没有相应的乘除法操作,要转换成加减或者与,抑或运算完成,为方便起见,规定的数据不讨论符号,对于乘除法操作,以最优解替换
posted on 2017-12-05 18:59  丿尛丶熊  阅读(229)  评论(0编辑  收藏  举报