程式的機器級表示

2021-09-26 18:22:00 字數 2122 閱讀 8855

本文對《深入理解計算機系統》(第三版)中第三章——「程式的機器級表示」中的部分內容進行了整理,以方便日後查閱。

目錄

1. 整數暫存器

2. 運算元

3. 資料傳送指令——mov類。

4. 壓入和彈出棧資料——push操作和pop操作

5. 算術和邏輯操作

6. 條件碼

7. 比較和測試指令——cmp和test

8. set指令

9. jmp跳轉指令

乙個x86-64的**處理單元(cpu)包含一組16個儲存64位值得通用目的暫存器。這些暫存器用來儲存整數資料和指標。

大多數指令有乙個或多個運算元(operand),指示出執行乙個操作中要使用的源資料值,以及放置結果的目的位置。

運算元可分為三種型別:

(1) 立即數(immediate)  用來表示常數值。用$imm表示立即數定址,imm表示乙個整數。eg. $0x1f

(2) 暫存器(register)  表示某個暫存器的內容。用ra表示暫存器定址,ra表示任意暫存器

(3) 記憶體引用  根據計算出的位址(通常稱為有效位址)訪問某個記憶體位置。常用定址模式為imm(ra, ri, s),其中ra, ri, s分別                    表示基址暫存器、變址暫存器和比例因子。s必須是1、2、4或者8。ra, ri必須是64位暫存器。有效位址的計算公式為:                    imm + r[ra] + r[ri]*s

將資料從源位置複製到目的位置。movabsq指令能夠以任意64位立即數值作為源運算元,並且只能以暫存器作為目的。

cpu維護了一組單個位的條件碼(condition code)暫存器,它們描述了最近的算術或邏輯操作的屬性。可以檢測這些暫存器來執行條件分支指令。

條件碼通常不會直接讀取,有三種常見的使用方法:

(1) 根據條件碼的某種組合,將乙個位元組設定為0或者1

(2) 條件跳轉到程式的某個其他的部分

(3) 可以有條件的傳送資料

cmp指令根據兩個運算元之差來設定條件碼。test指令根據兩個運算元相與後的結果來設定條件碼。這兩個指令都不修改任何暫存器的值,只設定條件碼。

set指令根據條件碼的某種組合,將低位單位元組暫存器元素或者乙個位元組的記憶體位置設定成0或者1。set指令對應於條件碼的第一種使用方法。

注意:(1)set指令後的字尾表示不同的條件,而不是運算元大小。比如setl、setb中 l 表示 less,b 表示 below。

(2)set指令將低位單位元組暫存器元素或者乙個位元組的記憶體位置設定成0或者1。為了得到乙個32位或64位結果,必須對高位               清零。

jmp指令讓程式切換到乙個全新的位置執行。通常用乙個標號(label)來表示跳轉的目的地。

jmp指令是無條件指令,分為直接跳轉和間接跳轉兩種。直接跳轉是給出乙個標號作為跳轉目標,該跳轉目標是作為指令的 一 部分編碼的,如jmp .l1。間接跳轉的跳轉目標是從暫存器或記憶體位置中讀出的,寫法是*後面跟乙個運算元指示符,如        jmp    *(%rax),這條指令表示從%rax中的值作為讀位址,從記憶體中讀出跳轉目標。

程式的機器級表示

三種 立即數 常數值,在att格式的彙編 中,書寫格式是 整數,如 123 0x12 暫存器 如 32位的 eax 16位的 ax 8位的 al 儲存器引用 mov 同等傳送,即倆者的大小一致 如 movb byte,movew word,movel longword dw movs movz 不同...

程式的機器級表示

32位和64位 instruction system architecture 程式計數器pc eip 整數暫存器 8個每個32位 有的用來記錄狀態,有的用來儲存臨時資料,區域性變數,返回值 3.條件碼暫存器 指標都是雙字 char short long 其他4位元組 movb movw movl ...

程式的機器級表示(二)

以上操作,我們只考慮了直線 的行為,即指令按順序執行。但是還有一些 比如條件語句 迴圈語句和分支語句,要求有條件的執行,這時需要根據資料測試的結果來改變條件碼,結合跳轉指令決定操作執行的順序。條件傳送指令 實現條件操作的傳統方法是利用控制的條件轉移。當條件滿足時,程式沿著一條執行路徑進行,而當條件不...