博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018-2019-1 20165322 第八周课上测试补做
阅读量:5163 次
发布时间:2019-06-13

本文共 3388 字,大约阅读时间需要 11 分钟。

第八周课上测试补做

题目二

  • 把第一个练习中的代码在X86-64(Ubuntu)中反汇编,给出汇编代码和机器码的截图
  • 把X86-64汇编翻译成Y86-64汇编,并给出相应机器码的截图(使用附件中的Y86-64模拟器)

过程:

  • 终端输入gcc -E test1.c -o test1.i
  • 终端输入gcc -S test.1.i -o main.s
  • cat test1.s查看汇编代码,objdump -d test1命令查看机器码
    1044876-20181130235435314-1894939872.png

1044876-20181130235443747-1576916884.png

  • 安装词法分析工具:sudo apt-get install bison flex
  • 安装Tcl/Tk支持图形界面:sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5
  • 解压sim包后打开修改Makefile文件:
    • GUIMODE=-DHAS_GUI(去掉#)
    • TKLIBS=-L/usr/lib -ltk8.5 -ltcl8.5
    • TKINC=-I/usr/include/tcl8.5
  • 在sim路径下终端输入:
    • make clean
    • make
      即可将sim包中的.ys文件全部转换为.yo文件
  • 在pipe路径下终端输入./psim -t -g ../y86-code/asum.yo跳出Y86-64模拟器,测试成功

    1044876-20181130235515822-533762018.png

  • 由于不会编写第一题的X86-64代码……没有得到想要的.ys文件……弃疗……

出现的问题及解决方法

  • make时,出现了对'matherr'未定义引用的错误

    1044876-20181130235157591-1231185680.jpg

  • 解决:
    • 根据报错信息,进入pipe目录将psim.c文件中包含'matherr'的两行代码注释掉
    • 进入seq目录将ssim.c文件中包含'matherr'的两行代码注释掉
    • 再次make clean、make后成功

      题目三

  • 基于socket 使用教材的csapp.h csapp.c,实现daytime(13)服务器(端口我们使用13+后三位学号)和客户端
  • 服务器响应消息格式是
客户端IP:XXXX服务器实现者学号:XXXXXXXX当前时间: XX:XX:XX

过程

代码:

  • echo.c
#include "csapp.h"#include 
void echo(int connfd, char *haddrp){ time_t t; struct tm * lt; size_t n; char buf[MAXLINE]; rio_t rio; Rio_readinitb(&rio, connfd); while((n = Rio_readlineb(&rio, buf, MAXLINE)) != 0) { //line:netp:echo:eof //printf("server received %d bytes\n", n); printf("\n客户端IP:%s\n",haddrp); printf("服务器实现者学号:20165322\n"); time (&t);//获取Unix时间戳 lt = localtime (&t);//转为时间结构 printf ("当前时间为:%d/%d/%d %d:%d:%d\n",lt->tm_year+1900, lt->tm_mon+1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);//输出结果。注意月份取值区间为[0,11],所以要+1;年份的修改。 Rio_writen(connfd, buf, n); }}
  • server.c
#include "csapp.h"void echo(int connfd, char *haddrp);int main(int argc, char **argv) {    int listenfd, connfd, port, clientlen;    struct sockaddr_in clientaddr;    struct hostent *hp;    char *haddrp;    if (argc != 2) {    fprintf(stderr, "usage: %s 
\n", argv[0]); exit(0); } port = atoi(argv[1]); listenfd = Open_listenfd(port); while (1) { clientlen = sizeof(clientaddr); connfd = Accept(listenfd, (SA *)&clientaddr, &clientlen); /* determine the domain name and IP address of the client */ hp = Gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr, sizeof(clientaddr.sin_addr.s_addr), AF_INET); haddrp = inet_ntoa(clientaddr.sin_addr); printf("server connected to %s (%s)\n", hp->h_name, haddrp); echo(connfd, haddrp); Close(connfd); } exit(0);}
  • client.c
#include "csapp.h"int main(int argc, char **argv) {    int clientfd, port;    char *host, buf[MAXLINE];    rio_t rio;    if (argc != 3) {    fprintf(stderr, "usage: %s 
\n", argv[0]); exit(0); } host = argv[1]; port = atoi(argv[2]); clientfd = Open_clientfd(host, port); Rio_readinitb(&rio, clientfd); while (Fgets(buf, MAXLINE, stdin) != NULL) { time_t t; struct tm * lt; size_t n; printf("\n客户端IP:127.0.0.1\n"); printf("服务器实现者学号:20165322\n"); time (&t);//获取Unix时间戳 lt = localtime (&t);//转为时间结构 printf ("当前时间为:%d/%d/%d %d:%d:%d\n",lt->tm_year+1900, lt->tm_mon+1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);//输出结果。注意月份取值区间为[0,11],所以要+1;年份的修改。 Rio_writen(clientfd, buf, strlen(buf)); Rio_readlineb(&rio, buf, MAXLINE); Fputs(buf, stdout); } Close(clientfd); //line:netp:echoclient:close exit(0);}
  • 注意编译时要将echo.c csapp.c 和client.c一起编译
  • 同样server.c 也要与另外两个代码一起编译

实验结果截图

1044876-20181130235028527-596846365.png

转载于:https://www.cnblogs.com/wangyaojia/p/10047597.html

你可能感兴趣的文章
如何判断一个人的能力
查看>>
【学习笔记】 狄利克雷与莫比乌斯
查看>>
关于 DataRow 中为 DataRowState.Deleted 状态的 字段列值取值方法
查看>>
724.Find Pivot Index
查看>>
小牛必会之—monkey
查看>>
python3.6.3安装步骤,适用linux centos系统
查看>>
没有终结点在侦听可以接受消息的*这通常是由于不正确的地址或者 SOAP操作导致的...
查看>>
HTML5---15.网络接口
查看>>
接收xml请求流并解析字符串的例子
查看>>
中文字符串分隔的注意问题
查看>>
zip打包是去掉路径
查看>>
常用的经典jquery代码[转]
查看>>
正则判断
查看>>
转--RTP如何打包H264数据
查看>>
IOC及AOP实现原理
查看>>
CocoaPods安装和使用教程
查看>>
WordPress博客搭建与问题总结
查看>>
C#中 property 与 attribute的区别
查看>>
POJ 1988 Cube Stacking(带权并查集)
查看>>
VMware vSphere虚拟化-VMware ESXi 5.5组件安装过程记录
查看>>