www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - two mains

Trying to learn from the ground up and would appreciate some assistance 
making sense of the following:

// void main(){} [1]
.text._Dmain	segment
	assume	CS:.text._Dmain
_Dmain:
		push	RBP
		mov	RBP,RSP
		xor	EAX,EAX
		pop	RBP
		ret
.text._Dmain	ends
.cto

// void main(string[] args) {} [2]
.text._Dmain	segment
	assume	CS:.text._Dmain
_Dmain:
		push	RBP
		mov	RBP,RSP
		sub	RSP,010h
		xor	EAX,EAX
		leave
		ret
.text._Dm

Both of segments of code deal with a minimal D program: the first taking 
no arguments and the second taking a string array. Prior .text_Dmain 
segment of both files mirror each other with the exception of module 
name differences.

The first difference that jumps out at me is that the ".text._Dmain 
segment" in [1] properly terminates with ".text._Dmain ends" like all 
other segments in the file up to this point. [2] is improperly: 
".text._Dm".

The second is the use of leave in [2]. If I understand correctly, leave 
is the exact same as:

		mov	RBP,RSP
		pop	RBP

So why do we need to mov RBP, RSP in [2] but not in [1]? I'm thinking 
this is because RBP contains the address of args but not sure.

Last is the .cto at the end of [1], what on earth is it and what is it 
used for? Why does it not exist in [2]?

Thanks,
Andrew
Jan 26 2013