1. 程式人生 > >2018-2019-1 20165226 《資訊安全系統設計基礎》第4周學習總結

2018-2019-1 20165226 《資訊安全系統設計基礎》第4周學習總結

2018-2019-1 20165226 《資訊安全系統設計基礎》第4周學習總結

目錄


教材學習內容總結


1、Y86-64指令集體系結構

可見狀態

  • 三個條件碼:ZF——零標誌, SF——符號,OF——有符號溢位
  • Y86用虛擬地址引用儲存器位置。 程式狀態的最後一個部分是狀態碼Stat,它表明程式執行的總體狀態

Y86-64指令

  • movl:irmovl、rrmovl、mrmovl、rmmovl,分別顯式地指明源和目的地的格式。第一個字母表明源的型別,i(立即數)、r(暫存器)或m(儲存器 ),第二個字母代表目的,可以是r或者m。
  • OPl(整數操作指令):addl、subl、andl和xorl。只對暫存器資料進行操作,同時還設定條件碼。
  • jXX(跳轉指令):jmp、jle、jl、je、jne、jge、jg,根據分支指令的型別和條件碼的設定來選擇分支。
  • cmovXX(條件傳送指令):cmovle、cmovl、cmove、cmovne、cmovge和comvg,與暫存器-暫存器傳送指令rrmovl一樣,但只有當條件碼滿足所需要的約束時才會更新目的暫存器的值。
  • call和ret:call指令將返回地址入棧,然後跳轉到目的地址。ret指令從這樣的過程呼叫中返回。
  • pushl和popl:入棧和出棧。
  • halt:停止指令的執行。

注意:不允許從一個儲存器地址直接傳送到另一個儲存器地址,也不允許將立即數傳送到儲存器。

指令編碼

  • 指令的位元組級編碼規則:高4位為程式碼部分,低四位為功能部分,功能值只有在一組相關指令共用一個程式碼時才有用。
數字 暫存器名字 數字 暫存器名字
0 %eax 8 %r8
1 %ecx 9 %r9
2 %edx A %r10
3 %ebx B %r11
4 %esp C %r12
5 %ebp D %r13
6 %esi E %r14
7 %edi F 無暫存器

位元組序列轉換成Y86-64指令方法

  • 通過程式碼部分確定指令長度,從而以指令為單位劃分位元組序列
  • 通過功能部分確定具體指令
  • 通過暫存器指示符位元組確定指令中涉及的暫存器
  • 通過轉換數值部分以小端法編碼的數字來確定立即數、偏移量、絕對地址等值

Y86異常

  • 狀態碼:描述程式執行的總體狀態。
名字 含義
1 AOK 正常操作
2 HLT 處理器執行halt指令(指令停止)
3 ADR 遇到非法地址
4 INS 遇到非法指令
  • Y86中,任何AOK以外的程式碼都會使處理器停止執行指令,而沒有異常處理程式。

2、邏輯設計與硬體控制

HCL:硬體控制語言
HDL:硬體描述語言

  • 邏輯閘型別

  • 組合電路和HCL布林表示式
    • 組合電路:將很多的邏輯閘組合成一個網,能構建計算塊。
    • 多路複用:根據輸入控制訊號的值,從一組不同的資料訊號中選出一個。
     [
      select1 :   expr_1
      select2 :   expr_2
          ......
      selectk :   expr_k
      ]

構建這些網有2條限制:

(1)兩個或多個邏輯閘的輸出不能連線在一起
(2)這個網必須是無環的。

HCL表示式和C語言中邏輯表示式的區別:

(1)組合邏輯電路的輸出會持續地響應輸入的變化;C表示式只有在程式執行過程中被遇到時才會求值。
(2)C的邏輯表示式允許引數是任意整數,0表示FLASE,其他任何值都表示TRUE;邏輯閘只對位值0和1進行操作。
(3)C的邏輯表示式可能只被部分求值;組合邏輯沒有部分求值的規則,邏輯閘只是簡單地響應輸入的變化。

  • 字級的組合電路和HCL整數表示式
    • 執行字級計算的組合電力根據輸入字的各個為,用邏輯閘來計算輸出字的各個位。
    • 用中等粗度的線來表示攜帶字的每個位的線路,用虛線來表示布林訊號結果。
    • 在HCL中,多路複用函式用情況表示式來描述。
    • 算術/邏輯單元是一種很重要的組合電路。
  • 集合關係
    • 判斷集合關係的通用格式是:iexpr in {iexpr1,iexpr2,……,iexprk}
  • 儲存器和時鐘
    • 時鐘暫存器(簡稱暫存器):儲存單個位或字,時鐘訊號控制暫存器載入輸入值
    • 隨機訪問儲存器(簡稱記憶體):儲存多個字,用地址來選擇該杜或該寫哪個字

3、Y86-64的順序實現

  • 將處理組織成階段

    取指——譯碼——執行——訪存——寫回——更新PC

    (處理器無限迴圈,執行這些階段)

  • SEQ硬體結構、SEQ的時序

    SEQ的實現包括組合邏輯和兩種儲存器裝置:時鐘暫存器(程式計數器和條件碼暫存器)和隨機訪問暫存器(暫存器檔案、指令儲存器和資料儲存器)。

    !!遵循以下原則組織計算:
    處理器從來不需要為了完成一條指令的執行而去讀由該指令更新了的狀態。

  • SEQ階段的實現

    • 常數一般用大寫表示。

取指階段

取指階段包括指令儲存器硬體單元。

譯碼和寫回階段(均需訪問暫存器檔案)

執行階段

執行階段包括算術/邏輯單元(ALU)。

訪存階段

訪存階段的任務就是讀或者寫程式資料。

訪存階段最後的功能是根據取值階段產生的icode、imem_error、instr_valid值以及資料儲存器產生的dmem_error訊號,從指令執行的結果來計算狀態碼Stat。

更新PC階段

會產生程式計數器的新值。

返回目錄

教材學習中的問題和解決過程


  • 問題1:

    在學習指令"rmmovq %rcx,-3(%rbx)"對應的編碼時對於-3擴充套件不是很清楚。

  • 問題1解決方案:

    經過查詢資料,-3十六進位制表示為83,擴充套件為八位元組,則需在左邊添14位,但是考慮到是負數,因此將8移到最前面,又因為負數補碼是除最高位不變,其餘取反加一,然後再將其寫為小端方式

  • 問題2:

    在安裝時Y86-64時,報錯:無法定位軟體包 fiex

  • 問題2解決方案:

    ①在軟體中新增源:sudo vim /etc/apt/source.list,然後在檔案裡輸入deb http://cz.archive.ubuntu.com/ubuntu lucid main,儲存退出
    ②依次輸入:sudo spt-get update,sudo apt-get upgrade,sudo apt-get install **

  • 問題3:

    無法成功make

  • 問題3解決方案:

    逐步比對,看是否有檔案未彙編,發現asuml.ys未彙編,檢視其檔案進行彙編後,成功完成make指令

  • 問題4:

    在檢視asuml.yo時出現問題,發現沒有.yo檔案,然後將其make報錯

  • 問題4解決方案:

    檢視asuml.ys的檔案路徑,於是在/sim/y86-code中進行指令操作make asuml.yo

返回目錄

程式碼學習中的問題和解決過程


  • 問題1:下載sim時報錯

  • 問題1解決方案:

    使用另一個地址資訊,輸入wget http://labfile.oss.aliyuncs.com/courses/413/sim.tar,然後就能解決了

  • 問題2:install bison fiex包出錯

將語句換成sudo apt-get install bison flex tk

  • 問題3:make clean時出錯

  • 問題3解決方案:

    返回上一層再輸入make clean就OK

  • 問題4:安裝Tcl時指令錯誤
  • 問題4解決方案:

    指令輸入錯誤,將1換成l

返回目錄

程式碼託管與統計


程式碼託管

返回目錄

學習進度條


程式碼行數(新增/累積) 部落格量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 87/87 2/2 20/20
第二週 71/158 1/3 12/32
第三週 100/258 2/5 13/45
第四周 3265/9750 2/7 15/60

嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進自己的計劃能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。

參考:軟體工程軟體的估計為什麼這麼難軟體工程 估計方法

  • 計劃學習時間:8小時

  • 實際學習時間:15小時

  • 改進情況:

(有空多看看現代軟體工程 課件
軟體工程師能力自我評價表
)

返回目錄

參考資料


返回目錄