編譯器如何使用框架暫存器 作者 : 單位 : Email: URL : 陳鍾誠 金門技術學院資管系 [email protected] http://ccc.kmit.edu.tw 日期 : 2015/11/5 堆疊的範例 呼叫 swap 前 int main() { int a, b; a = 16; b=32; swap(&a, &b); return a-b; } void swap(int *a, int *b) { int c; c = *a; *a = *b; *b=c; } 呼叫 swap 後 0 保存的 ebp 24 保存的 ebp -4 a 20 a -8 b 16 b -12 &a 12 &b -16 &b 8 &a 4 返回地址 0 保存的 ebp -4 c 註:ebp 為堆疊的基底指標 堆疊 相對於 esp 的位址 2 陳鍾誠 - 2015/11/5 編譯後的 swap 程式 .text _swap: pushl movl subl movl movl movl movl movl movl movl movl movl movl leave ret %ebp %esp, %ebp $4, %esp 8(%ebp), %eax (%eax), %ecx %ecx, -4(%ebp) 8(ebp), %eax 12(%ebp), %edx (%edx), %ecx %ecx, (%eax) 12(%ebp),%eax -4(%ebp),%ecx %ecx, (%eax) Swap 函數定義開始 保存堆疊基底指標 ebp 設定堆疊指標 esp 為 ebp (保留 ebp) 在堆疊中保留 4 個位元組給 c 變數 eax = a ecx = *a c = ecx ( c = *a;) eax = a edx = b ecx = *b *a = ecx (*a = *b;) eax = b ecx = c *b = ecx (*b = c;) 恢復 ebp, esp 的值 = movl %ebp, %esp; popl %ebp; (返回上一層) 3 陳鍾誠 - 2015/11/5 編譯後的 main 程式 _main: pushl movl subl movl movl leal pushl leal pushl call movl subl leave ret %ebp %esp, %ebp $8, %esp $16, -4(%ebp) $32, -8(%ebp) -8(%ebp), %eax %eax -4(%ebp), %eax %eax _swap -4(%ebp), %eax -8(%ebp), %eax main 函數定義開始 保存堆疊基底指標 ebp 設定堆疊指標 esp 為 ebp (保留 ebp) 保留 a, b 兩變數的空間 a =16 b = 32 準備呼叫 swap call _swap eax = a eax = eax-b 4 陳鍾誠 - 2015/11/5 參考文獻 80X86組合語言 http://en.wikibooks.org/wiki/X86_Assembly 5 陳鍾誠 - 2015/11/5