編譯器如何使用框架暫存器
作者 :
單位 :
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
Download

GccAsm