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


程序的機器級表示

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

1 如何產生匯編代碼

gcc -O1 -S code.c

objdump -d code.o

objdump -d code

2 數據格式

Intel用“字”表示16位數據類型,32位數為“雙字”,64位數為“四字”

3 IA32位寄存器

wps_clip_image-19481wps_clip_image-7229

4 數據傳送指令的限制

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

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

如:jmp .L1

.L1:

popl %edx

這就就是直接跳轉

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)對棧位置的引用相當於棧指針。大多數函數在調用開始時分配所需要的整個棧存儲,在過程開始時通過減小棧指針,並在調用過程中保持棧指針指向固定位置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM