課本中涉及到了許多Y86-64彙編程序與x86-64彙編程序的比較,如何安裝Y86模擬器,並生成彙編程序呢?html
1.安裝bison和flex詞法分析工具:git
2.在http://csapp.cs.cmu.edu/public/students.html地址下載sim並解壓。編程
3.安裝tcl/tk:ubuntu
4.修改Makefile文件(sim文件夾下的):安全
其中,最後一行的路徑即爲剛纔查詢的位置。網絡
5.接下來使用make命令編譯便可。多線程
『注意』:併發
編譯時可能會出現如下提示:app
這時,須要先make clean
,再make
:函數
6.成功編譯後,使用cat
命令查看Y86-64的彙編程序:
7.咱們能夠打開模擬器,使其進行更爲直觀的演示。以pipe文件夾爲例,注意到文件夾下有一個名爲「psim」的可執行文件,輸入./psim -t -g ../y86-code/asum.yo
便可打開模擬器:
點擊「Go」按鈕,下方的「取指階段」、「譯碼階段」、「執行階段」和「存儲階段」就會一步一步顯示其變化,最下面的寄存器堆還能夠查看各個寄存器的存儲狀況。
課本P246圖4-2展現了Y86-64指令集,在後面的學習中也常常須要查看並分析這個圖表。在這裏藉助圖4-2簡要分析一下Y86-64的指令,爲後續學習打下基礎。
閱讀上圖須要注意如下幾個方面:
1.圖中左邊是指令的彙編碼錶示,右邊是字節編碼
2.指令的編碼長度從1個字節到10個字節不等。一條指令含有一個單字節的指令提示符,可能含有一個單字節的寄存器指示符,還可能含有一個8字節的常數字。
3.字段fn指明是某個整數操做(Opq)、數據傳送條件(cmovXX)或是分支條件(jXX)。
4.每條指令的第一個字節代表指令的類型。這個字節分爲兩部分,每部分4位:高4位是代碼(code)部分,低4位是功能(function)部分。功能碼以下:
5.15個程序寄存器中每一個都有一個相對應的範圍在0到0xE之間的寄存器標識符(register ID)。當須要指明不該該訪問任何寄存器時,就用ID值0xF表示。
課本P259提到了字集的多路複用器電路,是如何實現多路複用的呢?
查閱資料瞭解到,多路複用是指以同一傳輸媒質(線路)承載多路信號進行通訊的方式。各路信號在送往傳輸媒質之前,需按必定的規則進行調製,以利於各路已調信號在媒質中傳輸,並不致混淆。
如上圖所示,這個電路根據控制輸入位s,產生一個64位的字Out,等於兩個輸入字A或者B之中的一個。這個電路由64個相同的子電路組成,每一個子電路的結構都是一個位級多路複用器。
能夠觀察到,這個字級的電路只產生一次!s,而後在每一個位的地方都重複使用它,以此減小反處理器和非門的數量。
What is register file?
register file的概念不難理解。register file是CPU中多個寄存器組成的陣列,一般由快速的靜態隨機讀寫存儲器(SRAM)實現。這種RAM具備專門的讀端口與寫端口,能夠多路併發訪問不一樣的寄存器。
register file有兩個讀端口(A和B),還有一個寫端口(W)。這樣一個多端口隨機訪問存儲器容許同時進行多個讀和寫的操做。如上圖所示的register file中,電路能夠讀兩個程序寄存器的值,同時更新第三個寄存器的狀態。每一個端口都有一個地址輸入,代表該選擇哪一個程序寄存器,另外還有一個數據輸出或對應該程序寄存器的輸入值。
向寄存器文件寫入字是由時鐘信號控制的,控制的方式相似於將值加載到時鐘寄存器。每次時鐘上升時,輸入valW上的值會被寫入輸入dstW上的寄存器ID指示的程序寄存器。
肯定下列每一個字節序列所編碼的Y86-64指令序列。若是序列中有不合法的字節,指出指令序列中不合法值出現的位置。每一個序列都先給出了起始地址,冒號,而後是字節序列。
A. 0x100: 30f3fcffffffffffffff | irmovq $-4,%rbx 0x10a: 40630008000000000000 | rmmovq %rsi,0x800(%rbx) 0x114: 00 | halt
B. 0x200: a06f | pushl %rsi 0x202: 800802000000000000 | call proc 0x20b: 00 | halt 0x20c: | proc: 0x20c: 30f30a00000000000000 | irmovq $10,%rbx 0x216: 90 | ret
C. 0x300: 50540700000000000000 | mrmovq 7(%rsp),%rbp 0x30a: 10 | nop 0x30b: f0 | .byte 0xf0 # invalid instruction code 0x30c: b01f | popq %rcx
綜上過程,分析過程的大體思路以下:①根據指令編碼的代碼部分和功能部分肯定相應指令;②根據指令的結構肯定所取字節數,以分割字節序列;③另外,須要根據字節數依次類推每一條指令的起始地址。分析時應格外注意非法指令等各類非法狀況。
寫出SEQ實現中信號need_valC的HCL代碼。
下圖爲SEQ的取指階段,以PC做爲起始地址,從指令內存中讀取10個字節。根據這些字節,咱們產生出各個指令字段。
根據課本上的提示咱們能夠知道,need_valC的HCL描述能夠肯定指令是否包含一個常數字。
再根據Y86-64指令集中對各個指令的功能描述,就能夠肯定哪些有常數字段了。
最終的HCL代碼以下:
bool need_valC = [ icode in {IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL}; ]
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 20篇 | 400小時 | |
第一週 | 50/50 | 1/1 | 8/8 | 瞭解計算機系統、靜態連接與動態連接 |
第三週 | 451/501 | 2/3 | 27/35 | 深刻學習計算機算術運算的特性 |
第四周 | 503 / 1004 | 1/4 | 20/55 | 掌握程序崩潰處理、Linux系統編程等知識,利用所學知識優化myod,並實現head和tail命令 |
第五週 | 315 / 1319 | 3/7 | 29/84 | 掌握「進程」的概念,並學習應用相關函數;瞭解程序如何在機器上表示 |
第七週 | 264 / 1583 | 1/8 | 15/99 | 瞭解處理器的體系結構,學習多線程的概念 |