程序的機器級表示
最近因為在忙我們數據倉庫的開源工作,要是一個C++系統開源,工作量實在是大,說起來都是淚(累)。以及生活中的一些事,找房子什么的,學習東西的時間比較少,這個系列很長時間沒有更新,爭取年前搞完,廢話少說,直接介紹知識點。
1 如何產生匯編代碼
gcc -O1 -S code.c
objdump -d code.o
objdump -d code
2 數據格式
Intel用“字”表示16位數據類型,32位數為“雙字”,64位數為“四字”
3 IA32位寄存器
4 數據傳送指令的限制
兩個操作數不能都指向存儲器位置
5 直接跳轉與間接跳轉的區別
如:jmp .L1
.L1:
popl %edx
這就就是直接跳轉
jmp *%eax
用寄存器%eax中的值作為跳轉的目標。條件跳轉只能是直接跳轉
6 if和switch的區別
Switch通過跳轉表來實現,跳轉表的優點是執行開關語句的時間與開關情況的數量無關。跳轉表更加高效。If通過條件跳轉實現。
7 棧幀結構
8 指針差
結構值是除以數據類型大小后的值
9 最小化緩存區溢出攻擊方法
隨機化、棧保護和限制那部分存儲器存儲可執行代碼
10 IA32和x86-64通用寄存器對比
11 x86-64特性
1)指針和長整數是64位長
2)通用目的寄存器從8個擴展到16個
3)許多程序狀態都保存在寄存器中,而不是在棧上。整形和指針過程參數(最多6個)通過寄存器傳遞。
4)對棧位置的引用相當於棧指針。大多數函數在調用開始時分配所需要的整個棧存儲,在過程開始時通過減小棧指針,並在調用過程中保持棧指針指向固定位置。