C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[12]: 生成されるアセンブラコードについての疑問


(過去ログ 45 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■24281 / inTopicNo.1)  生成されるアセンブラコードについての疑問
  
□投稿者/ ネタ好き未記入 (58回)-(2008/08/31(Sun) 22:16:31)

分類:[C/C++] 

2008/08/31(Sun) 22:17:05 編集(投稿者)
いつもお世話になっています。
今回はVCで生成されるアセンブラについて分からないことがありますので訊きます。
アセンブラを調べる事が目的なので、以下の意味のないCプログラムをコマンドラインでコンパイルしました。
※VC2008を使用しました

//対象となるプログラム
void main(void) {
	char ch = 0;
	int in = 0;
	float fl = 0;
	double dou = 0;
}

cl ファイル名 /Fas

//生成されたアセンブラ(MASM)

; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.21022.08 

	TITLE	ファイル名のフルパス
	.686P
	.XMM
	include listing.inc
	.model	flat

INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES

PUBLIC	__real@0000000000000000
PUBLIC	__real@00000000
PUBLIC	_main
EXTRN	__fltused:DWORD
;	COMDAT __real@0000000000000000
; File f:\cの復習\sytemtypes.c
CONST	SEGMENT
__real@0000000000000000 DQ 00000000000000000r	; 0
CONST	ENDS
;	COMDAT __real@00000000
CONST	SEGMENT
__real@00000000 DD 000000000r			; 0
; Function compile flags: /Odtp
CONST	ENDS
_TEXT	SEGMENT
_ch$ = -21						; size = 1
_fl$ = -20						; size = 4
_dou$ = -16						; size = 8
_in$ = -4						; size = 4
_main	PROC
; Line 1
	push	ebp
	mov	ebp, esp
	sub	esp, 24					; 00000018H
; Line 2
	mov	BYTE PTR _ch$[ebp], 0
; Line 3
	mov	DWORD PTR _in$[ebp], 0
; Line 4
	fldz
	fstp	DWORD PTR _fl$[ebp]
; Line 5
	fldz
	fstp	QWORD PTR _dou$[ebp]
; Line 6
	xor	eax, eax
	mov	esp, ebp
	pop	ebp
	ret	0
_main	ENDP
_TEXT	ENDS
END


このコードでどうしてもわからないのが次の部分です。

PUBLIC	__real@0000000000000000
PUBLIC	__real@00000000
PUBLIC	_main

main関数の引数はvoidにしているはずなのに、この意味不明な公開変数?_real@はなにものなのでしょうか?
因みに

void main(){
}

のコードをコンパイルした時は
PUBLIC	_main
だけでした。
どうしても気になります。
ご存じの方教えて下さい。よろしくお願いいたします。

引用返信 編集キー/
■24282 / inTopicNo.2)  Re[1]: 生成されるアセンブラコードについての疑問
□投稿者/ επιστημη (1284回)-(2008/08/31(Sun) 23:07:13)
επιστημη さんの Web サイト
> PUBLIC __real@0000000000000000
> PUBLIC __real@00000000
> PUBLIC _main
>
> main関数の引数はvoidにしているはずなのに、この意味不明な公開変数?_real@はなにものなのでしょうか?

double, float の定数値:0 のようだけど使ってませんねー
0の代入が最適化されfldzになって定数値の領域だけが残ったように思えます。

float fl = 0;
double dou = 0;

のとこを非0にしてみりゃわかる希ガス。

引用返信 編集キー/
■24284 / inTopicNo.3)  Re[2]: 生成されるアセンブラコードについての疑問
□投稿者/ あんどちん (16回)-(2008/09/01(Mon) 00:32:37)
最適化オプション付けると消えるから24282の通りではないでしょうか?

引用返信 編集キー/
■24289 / inTopicNo.4)  Re[3]: 生成されるアセンブラコードについての疑問
□投稿者/ ネタ好き未記入 (59回)-(2008/09/01(Mon) 09:50:30)
επιστημηさん、あんどちん さん教えて頂き有難うございます。
ご指摘の通り二つの浮動小数点の=0を消したらなくなりました。
どうやら_realは実数を意味していたようですね。

ところで、何故公開する必要があるのでしょうか?
デバッグに関係しているのでしょうか・・・
お二人はどう思われますか?
引用返信 編集キー/
■24290 / inTopicNo.5)  Re[4]: 生成されるアセンブラコードについての疑問
□投稿者/ επιστημη (1285回)-(2008/09/01(Mon) 09:55:11)
επιστημη さんの Web サイト
> ところで、何故公開する必要があるのでしょうか?
> デバッグに関係しているのでしょうか・・・

考えられるのは、その定数値が異なる複数のコンパイル・ユニットで使われているとき、
公開しておけばひとつの定数値をみんなが使える。
隠しちゃうとコンパイル・ユニットごとに定義せなならんですな。

引用返信 編集キー/
■24293 / inTopicNo.6)  Re[5]: 生成されるアセンブラコードについての疑問
□投稿者/ あんどちん (18回)-(2008/09/01(Mon) 10:28:45)
No24290 (επιστημη さん) に返信
>>ところで、何故公開する必要があるのでしょうか?
>>デバッグに関係しているのでしょうか・・・
>
> 考えられるのは、その定数値が異なる複数のコンパイル・ユニットで使われているとき、
> 公開しておけばひとつの定数値をみんなが使える。
> 隠しちゃうとコンパイル・ユニットごとに定義せなならんですな。
>

同意です。
ただ、このような固定値はcommonセクションに配置すればコンパイルユニットごとに定義されていても実害0って気がします。
# 今時はcommonセクションって概念無いのかな?

最適化すると消えるところから考えると、
・最初
「一旦作っちゃったからとりあえず出すよ。」
・最適化時
「最適化してて気付いたんだけど、これ使ってないから消しちゃえばいいじゃん。」
って感じですかね?

引用返信 編集キー/
■24295 / inTopicNo.7)  Re[6]: 生成されるアセンブラコードについての疑問
□投稿者/ ネタ好き未記入 (61回)-(2008/09/01(Mon) 10:38:41)
No24293 (あんどちん さん) に返信
> ■No24290 (επιστημη さん) に返信
> >>ところで、何故公開する必要があるのでしょうか?
> >>デバッグに関係しているのでしょうか・・・
>>
>>考えられるのは、その定数値が異なる複数のコンパイル・ユニットで使われているとき、
>>公開しておけばひとつの定数値をみんなが使える。
>>隠しちゃうとコンパイル・ユニットごとに定義せなならんですな。
>>
>
> 同意です。
> ただ、このような固定値はcommonセクションに配置すればコンパイルユニットごとに定義されていても実害0って気がします。
> # 今時はcommonセクションって概念無いのかな?
>
> 最適化すると消えるところから考えると、
> ・最初
> 「一旦作っちゃったからとりあえず出すよ。」
> ・最適化時
> 「最適化してて気付いたんだけど、これ使ってないから消しちゃえばいいじゃん。」
> って感じですかね?
>

期待通り濃い話が聞けて嬉しいです。
お二人の話しを聞いてふと思ったのですが、もしかしてリンカに関係するのでしょうか?
引用返信 編集キー/
■24298 / inTopicNo.8)  Re[7]: 生成されるアセンブラコードについての疑問
□投稿者/ επιστημη (1286回)-(2008/09/01(Mon) 12:23:05)
επιστημη さんの Web サイト
> もしかしてリンカに関係するのでしょうか?

もしかしなくてもリンカ絡みです。
コンパイルユニット通過後のおはなしなので。

> # 今時はcommonセクションって概念無いのかな?

CONST SEGMENT
__real@0000000000000000 DQ 00000000000000000r ; 0
CONST ENDS

"定数セグメント"ってくらいだから、同じシンボルを持ってたら
実体をひとつにまとめるくらいのことはしてくれんでねぇべか。

引用返信 編集キー/
■24338 / inTopicNo.9)  Re[8]: 生成されるアセンブラコードについての疑問
□投稿者/ あんどちん (19回)-(2008/09/02(Tue) 00:22:06)
出されているプログラムの
= 0をそれぞれ0.1に変えると

CONST SEGMENT
__real@3fb999999999999a DQ 03fb999999999999ar ; 0.1
CONST ENDS
; COMDAT __real@3dcccccd
CONST SEGMENT
__real@3dcccccd DD 03dcccccdr ; 0.1
; Function compile flags: /Odtp
CONST ENDS

が出力され、代入部分も
; Line 6
fld DWORD PTR __real@3dcccccd
fstp DWORD PTR _fl$[ebp]
; Line 7
fld QWORD PTR __real@3fb999999999999a
fstp QWORD PTR _dou$[ebp]
になりますね。

引用返信 編集キー/
■24339 / inTopicNo.10)  Re[8]: 生成されるアセンブラコードについての疑問
□投稿者/ あんどちん (20回)-(2008/09/02(Tue) 00:35:37)
No24298 (επιστημη さん) に返信
> CONST SEGMENT
> __real@0000000000000000 DQ 00000000000000000r ; 0
> CONST ENDS
>
> "定数セグメント"ってくらいだから、同じシンボルを持ってたら
> 実体をひとつにまとめるくらいのことはしてくれんでねぇべか。
>
CONSTセグメントは纏めてくれないみたいです。
http://blogs.wankuma.com/andochin/archive/2008/09/02/155065.aspx
#COMMが付けば纏めてくれそうですが

引用返信 編集キー/
■24342 / inTopicNo.11)  Re[9]: 生成されるアセンブラコードについての疑問
□投稿者/ επιστημη (1291回)-(2008/09/02(Tue) 06:20:16)
επιστημη さんの Web サイト
> CONSTセグメントは纏めてくれないみたいです。
> http://blogs.wankuma.com/andochin/archive/2008/09/02/155065.aspx
> #COMMが付けば纏めてくれそうですが

えー。
でもでも、どのコンパイルユニットであろうが0.0は__real@0000000000000000なわけっしょ。
だったらこいつがPUBLICならリンク時に"シンボルもろかぶり"やんか。
纏まってくれんと説明つかねぇ。

引用返信 編集キー/
■24343 / inTopicNo.12)  Re[10]: 生成されるアセンブラコードについての疑問
□投稿者/ あんどちん (21回)-(2008/09/02(Tue) 07:05:31)
No24342 (επιστημη さん) に返信
> えー。
> でもでも、どのコンパイルユニットであろうが0.0は__real@0000000000000000なわけっしょ。
> だったらこいつがPUBLICならリンク時に"シンボルもろかぶり"やんか。
> 纏まってくれんと説明つかねぇ。
>
そういえばそうですね。
何か勘違いしてるかもしれません。

引用返信 編集キー/
■24344 / inTopicNo.13)  Re[11]: 生成されるアセンブラコードについての疑問
□投稿者/ あんどちん (22回)-(2008/09/02(Tue) 07:45:31)
No24343 (あんどちん さん) に返信
> ■No24342 (επιστημη さん) に返信
>>えー。
>>でもでも、どのコンパイルユニットであろうが0.0は__real@0000000000000000なわけっしょ。
>>だったらこいつがPUBLICならリンク時に"シンボルもろかぶり"やんか。
>>纏まってくれんと説明つかねぇ。
>>
> そういえばそうですね。
> 何か勘違いしてるかもしれません。
>

えぇ〜と勘違いしてました^^;
確認したところ
PUBLIC __real@...
はちゃんと纏められてました。


引用返信 編集キー/
■24348 / inTopicNo.14)  Re[12]: 生成されるアセンブラコードについての疑問
□投稿者/ ネタ好き未記入 (64回)-(2008/09/02(Tue) 09:53:10)
επιστημη さん、あんどちん さん有難うございます。
お陰で大変勉強になりました。
教えて頂いた情報をもとに精進します。
話しにひと段落がついたと思いますので解決済みとします。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -