CSAPP:第三章程式的機器級表示1
阿新 • • 發佈:2018-11-04
CSAPP:程式的機器級表示1
關鍵點:資料格式、運算元指示符。
資料格式
術語字(word)表示16位資料型別,32位數為雙字(double words),64位數為四字(quad words)。圖3-1給出了c語言的資料型別在x86-64中的大小。在64位機器中標準int為雙字,指標為8字。
不通資料型別產生的彙編程式碼字尾如圖所示。movb(傳送位元組)、movw(傳送字)、movl(傳送雙字)、movq(傳送四字)
訪問資訊
一個x86-64的中央處理單元(CPU)包含一組16個儲存64位值的通用目的暫存器,這些暫存器用來儲存整數資料和指標,圖3-2顯示了這16個暫存器。
- 8位:%al、%bl… (movb)
- 16位:%ax、%bx…(movw)
- 32位:%eax、%ebx…(movl)
- 64位:%rax、rbx…(movq)
運算元指示符
大多數指令有一個或者多個運算元,指出執行一個操作中要使用的源資料值,以及放置結果的目的位置。各種不通的運算元可以被分為三種類型:
- 立即數:用來表示常數值。書寫方式為(
$
0x123)。 - 暫存器:表示某個暫存器的內容,16個暫存器的低位1位元組、2位元組、4位元組或者8位元組中的一個作為運算元這些位元組分別對應於8位、16位、32位和64位。在圖3-3中用表示任意暫存器a,用引用
- 記憶體引用:根據計算出來的地址(通常稱為有效地址)訪問某個記憶體值。我們用符號表示儲存在記憶體中從地址Addr開始的b個位元組引用。
如圖3-3所示,有不通的定址方式,允許不通形式的記憶體引用。表示最常用的形式。這樣的引用包括四個部分,一個立即數偏移、一個基址暫存器,一個變址暫存器和一個比例因子,這裡的必須是1、2、4或者8。基址和變址暫存器必須是64位暫存器。有效地址計算為:。
舉例說明
運算元 | 型別格式 | 運算元值 | 定址方式 |
---|---|---|---|
%rax | 暫存器:Ra | R[Ra]:0x100 | 暫存器定址 |
0x104 | 儲存器:Imm | M[Imm]:0xAB | 絕對定址 |
$ 108 |
立即數:$ Imm |
Imm:108 | 立即數定址 |
(%rax) | 儲存器:(Ra) | M[R[Ra]]:0xff | 間接定址 |
4(%rax) | 儲存器:Imm(Rb) | M[Imm+R[Rb]]:0xAB | 基址+變址定址 |
9(%rax,%rdx) | 儲存器:Imm(Rb,Ri) | M[Imm+R[Rb]+R[Ri]]:0x11 | 變址定址 |
0xFC(,%rcx,4) | 儲存器:Imm(,Ri,s) | M[Imm+R[Ri]*s]:0xff | 比例變址定址 |
(%rax,%rdx,4) | 儲存器:(Rb,Ri,s) | M[R[Rb]+R[Ri]*s]:0x11 | 比例變址定址 |