1. 程式人生 > >CSAPP:第三章程式的機器級表示1

CSAPP:第三章程式的機器級表示1

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 比例變址定址