BayGC/05


Top / BayGC / 05

ebp と esp

今回の gc のかなめである、ebp と esp について知りました。

ソースコード

void test1() {
	int   a = 0x11112222;
	short b = 0x1234;
	char  c = 0x12;
	char  d = 0x34;
}

void test2() {
}

int main() {
	test1();
	test2();
	return 0;
}

アセンブラで出力

コメント欄で教えてもらった方法で、出力します。これだとだいぶ見やすくなります。

g++ -masm=intel -S 1.cpp
	.file	"2.cpp"
	.intel_syntax
	.text
	.align 2
.globl __Z5test1v
	.def	__Z5test1v;	.scl	2;	.type	32;	.endef
__Z5test1v:
	push	ebp
	mov	ebp, esp
	sub	esp, 8
	mov	DWORD PTR [ebp-4], 286335522
	mov	WORD PTR [ebp-6], 4660
	mov	BYTE PTR [ebp-7], 18
	mov	BYTE PTR [ebp-8], 52
	leave
	ret
	.align 2
.globl __Z5test2v
	.def	__Z5test2v;	.scl	2;	.type	32;	.endef
__Z5test2v:
	push	ebp
	mov	ebp, esp
	pop	ebp
	ret
	.def	___main;	.scl	2;	.type	32;	.endef
	.align 2
.globl _main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
	push	ebp
	mov	ebp, esp
	sub	esp, 8
	and	esp, -16
	mov	eax, 0
	add	eax, 15
	add	eax, 15
	shr	eax, 4
	sal	eax, 4
	mov	DWORD PTR [ebp-4], eax
	mov	eax, DWORD PTR [ebp-4]
	call	__alloca
	call	___main
	call	__Z5test1v
	call	__Z5test2v
	mov	eax, 0
	leave
	ret

void test1()

この関数はアセンブラでは以下のようになっています。

__Z5test1v:
	push	ebp
	mov	ebp, esp
	sub	esp, 8
	mov	DWORD PTR [ebp-4], 286335522
	mov	WORD PTR [ebp-6], 4660
	mov	BYTE PTR [ebp-7], 18
	mov	BYTE PTR [ebp-8], 52
	leave
	ret

leave というのは複合命令で、intel の CPU マニュアルを見ると、

mov esp,ebp
pop ebp

となっていることから、以下と等価であることがわかります。

__Z5test1v:
	push	ebp
	mov	ebp, esp
	sub	esp, 8
	mov	DWORD PTR [ebp-4], 286335522
	mov	WORD PTR [ebp-6], 4660
	mov	BYTE PTR [ebp-7], 18
	mov	BYTE PTR [ebp-8], 52
	mov	esp, ebp
	pop	ebp
	ret

void test2()

この関数はアセンブラでは以下のようになっています。

__Z5test2v:
	push	ebp
	mov	ebp, esp
	pop	ebp
	ret

二つの関数を比べると、以下のことがわかります。

これは、esp が特別なレジスターで演算に使えないため、ebp を解すというアセンブラでは常套テクニックだそうです。

スタックの状態

MENU

now: 7

リンク


最新の20件
2018-10-07 2018-09-20 2018-09-03 2018-05-09 2017-09-29 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-05-29 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 3286, today: 2, yesterday: 0

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:47:54 (3914d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.048 sec.