Presentation is loading. Please wait.

Presentation is loading. Please wait.

作者 : 陳鍾誠 單位 : 金門技術學院資管系 URL : 日期 : 2015/4/20 編譯器如何使用框架暫存器.

Similar presentations


Presentation on theme: "作者 : 陳鍾誠 單位 : 金門技術學院資管系 URL : 日期 : 2015/4/20 編譯器如何使用框架暫存器."— Presentation transcript:

1 作者 : 陳鍾誠 單位 : 金門技術學院資管系 URL : 日期 : 2015/4/20 編譯器如何使用框架暫存器

2 2 陳鍾誠 /4/20 堆疊的範例 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; } 保存的 ebp a b &b 返回地址 保存的 ebp &a c 保存的 ebp a b &a &b 呼叫 swap 前呼叫 swap 後 堆疊 註: ebp 為堆疊的基底指標 相對於 esp 的位址

3 3 陳鍾誠 /4/20 編譯後的 swap 程式.text _swap: pushl %ebp movl %esp, %ebp subl $4, %esp movl 8(%ebp), %eax movl (%eax), %ecx movl %ecx, -4(%ebp) movl 8(ebp), %eax movl 12(%ebp), %edx movl (%edx), %ecx movl %ecx, (%eax) movl 12(%ebp),%eax movl -4(%ebp),%ecx movl %ecx, (%eax) leave ret 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; ( 返回上一層 )

4 4 陳鍾誠 /4/20 編譯後的 main 程式 _main: pushl %ebp movl %esp, %ebp subl $8, %esp movl $16, -4(%ebp) movl$32, -8(%ebp) leal-8(%ebp), %eax pushl%eax leal-4(%ebp), %eax pushl%eax call_swap movl-4(%ebp), %eax subl-8(%ebp), %eax leave ret main 函數定義開始 保存堆疊基底指標 ebp 設定堆疊指標 esp 為 ebp( 保留 ebp) 保留 a, b 兩變數的空間 a =16 b = 32 準備呼叫 swap call_swap eax = a eax = eax-b

5 5 陳鍾誠 /4/20 參考文獻 80X86 組合語言


Download ppt "作者 : 陳鍾誠 單位 : 金門技術學院資管系 URL : 日期 : 2015/4/20 編譯器如何使用框架暫存器."

Similar presentations


Ads by Google