1. 程式人生 > >2018-2019-1 20165232 第八週課下作業

2018-2019-1 20165232 第八週課下作業

第八週課上測試補做

題目二

  • 把第一個練習中的程式碼在X86-64(Ubuntu)中反彙編,給出彙編程式碼和機器碼的截圖
  • 把X86-64彙編翻譯成Y86-64彙編,並給出相應機器碼的截圖(使用附件中的Y86-64模擬器)

過程:

終端輸入gcc -E sum.c -o sum.i
終端輸入gcc -S test.1.i -o main.s
用cat sum.s檢視彙編程式碼,objdump -d sum命令檢視機器碼

image

  1. 安裝bison和flex詞法分析工具:
sudo apt-get install bison flex

image

  1. 安裝tcl/tk:
sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5
  1. 下載並解壓sim.tar壓縮包,下載地址( http://labfile.oss.aliyuncs.com/courses/413/sim.tar)。

輸入命令

wget http://labfile.oss.aliyuncs.com/courses/413/sim.tar

下載,接著輸入命令tar -xvf sim.tar解壓sim壓縮包。

image

  1. 開啟sim中的Makefile,修改mkaefile檔案
    image
  2. 進入sim目錄,終端輸入make clean和make。

再輸入

./psim -t -g ../y86-code/asum.yo

image

題目三

  • 基於socket 使用教材的csapp.h csapp.c,實現daytime(13)伺服器(埠我們使用13+後三位學號)和客戶端
  • 伺服器響應訊息格式是
客戶端IP:XXXX
伺服器實現者學號:XXXXXXXX
當前時間: XX:XX:XX

過程

  • 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) {
    static char timestr[40];
    time_t t;
    struct tm *nowtime;
    time(&t);
    nowtime = localtime(&t);
    strftime(timestr,sizeof(timestr),"%Y-%m-%d %H:%M:%S",nowtime);
    printf("client IP:127.0.0.1\n");
    printf("number:20165232\n");
        printf("now:%s\n",timestr);
        printf("\n");
    Rio_writen(clientfd, buf, strlen(buf));
        Rio_readlineb(&rio, buf, MAXLINE);
        Fputs(buf, stdout);

    }

    Close(clientfd); //line:netp:echoclient:close
    exit(0);
}
  • server.c
#include "./csapp.h"

void echo(int connfd,char *haddrp);

int main(int argc, char **argv) 
{
    int listenfd, connfd, port;
    socklen_t 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);
}
void echo(int connfd,char *haddrp) 
{
    static char timestr[40];  
    time_t t;  
    struct tm *nowtime;
    time(&t);  
    nowtime = localtime(&t);  
    strftime(timestr,sizeof(timestr),"%Y-%m-%d %H:%M:%S",nowtime);
    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", (int)n);
    printf("service IP:%s\n",haddrp);
    printf("number:20165232\n");
    printf("now:%s\n",timestr);
    printf("\n");
    Rio_writen(connfd, buf, n);
    }
}
  • 編譯時,csapp.c和server.c,client.c分別同時編譯,結果如下
    image