2018-2019-1 20165322 第八周课上测试补做
第八周课上测试补做
题目二
- 把第一个练习中的代码在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
命令查看机器码
-
安装词法分析工具:
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模拟器,测试成功
-
由于不会编写第一题的X86-64代码……没有得到想要的
.ys
文件……弃疗……
出现的问题及解决方法
-
make时,出现了对'matherr'未定义引用的错误
-
解决:
- 根据报错信息,进入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 <time.h>
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 <port>\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 <host> <port>\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 也要与另外两个代码一起编译