十二天深刻理解計算機系統(三)

程序的機器級表示

最近由於在忙咱們數據倉庫的開源工做,要是一個C++系統開源,工做量實在是大,提及來都是淚(累)。以及生活中的一些事,找房子什麼的,學習東西的時間比較少,這個系列很長時間沒有更新,爭取年前搞完,廢話少說,直接介紹知識點。緩存

1 如何產生彙編代碼

gcc -O1 -S code.c函數

objdump -d code.o學習

objdump -d code指針

2 數據格式

Intel用「字」表示16位數據類型,32位數爲「雙字」,64位數爲「四字」code

3 IA32位寄存器

wps_clip_image-19481wps_clip_image-7229

4 數據傳送指令的限制

兩個操做數不能都指向存儲器位置blog

5 直接跳轉與間接跳轉的區別

如:jmp .L1ip

.L1:get

popl %edxit

這就就是直接跳轉cli

jmp *%eax

用寄存器%eax中的值做爲跳轉的目標。條件跳轉只能是直接跳轉

6 if和switch的區別

Switch經過跳轉表來實現,跳轉表的優勢是執行開關語句的時間與開關狀況的數量無關。跳轉表更加高效。If經過條件跳轉實現。

7 棧幀結構

wps_clip_image-10663

8 指針差

結構值是除以數據類型大小後的值

9 最小化緩存區溢出攻擊方法

隨機化、棧保護和限制那部分存儲器存儲可執行代碼

10 IA32和x86-64通用寄存器對比

wps_clip_image-11862

wps_clip_image-26167

11 x86-64特性

1)指針和長整數是64位長

2)通用目的寄存器從8個擴展到16個

3)許多程序狀態都保存在寄存器中,而不是在棧上。整形和指針過程參數(最多6個)經過寄存器傳遞。

4)對棧位置的引用至關於棧指針。大多數函數在調用開始時分配所須要的整個棧存儲,在過程開始時經過減少棧指針,並在調用過程當中保持棧指針指向固定位置。

相關文章
相關標籤/搜索