1. 程式人生 > >2017-2018-1 20155336 《信息安全系統設計基礎》第八周課堂測試

2017-2018-1 20155336 《信息安全系統設計基礎》第八周課堂測試

xxxxxxxx data 服務器 linu xxxxx 個數字 索引 當前 printf

2017-2018-1 20155336 《信息安全系統設計基礎》第八周課堂測試

1.求命令行傳入整數參數的和

  • 參考 http://www.cnblogs.com/rocedu/p/6766748.html#SECCLA 在Linux下完成“求命令行傳入整數參數的和”

  • 測試代碼傳入自己的8位學號

  • 上方提交代碼

  • 附件提交運行測試截圖

解答:

  • 編寫代碼

    #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
    

課下測試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沒有相應的乘除法操作,要轉換成加減或者與,抑或運算完成,為方便起見,規定的數據不討論符號,對於乘除法操作,以最優解替換

2017-2018-1 20155336 《信息安全系統設計基礎》第八周課堂測試