Ausgabe von MinGW



  • Hi!
    Ich bin zur Zeit dabei ein bisschen Assembler, sowohl unter Linux als auch Win32 zu lernen.

    Jetzt hab ich mal ein kleines HelloWorld C-Programm geschrieben:

    #include <stdio.h>
    int main() {
    	printf("Hallo\n");
    	return 0;
    }
    

    ... und es mit gcc -S compiliert.
    Nun habe ich Probleme, den Output zu verstehen den mit MinGW liefert:

    .file	"test.c"
    	.def	___main;	.scl	2;	.type	32;	.endef
    	.section .rdata,"dr"
    LC0:
    	.ascii "Hallo\0"
    	.text
    .globl _main
    	.def	_main;	.scl	2;	.type	32;	.endef
    _main:
    	pushl	%ebp
    	movl	%esp, %ebp
    	subl	$8, %esp
    	andl	$-16, %esp
    	movl	$0, %eax
    	addl	$15, %eax
    	addl	$15, %eax
    	shrl	$4, %eax
    	sall	$4, %eax
    	movl	%eax, -4(%ebp)
    	movl	-4(%ebp), %eax
    	call	__alloca
    	call	___main
    	movl	$LC0, (%esp)
    	call	_printf
    	movl	$0, %eax
    	leave
    	ret
    	.def	_printf;	.scl	2;	.type	32;	.endef
    

    Warum ist dieses Grundgerüst(im gegensatz zu der gcc Version mit Linux) so kompliziert?
    Warum gibt es 2 main-funktionen?
    Was soll dieses .def?
    Was passiert da bevor in _main __alloca und ___main aufgerufen wird?
    Warum überhaupt _alloca?

    Wäre nett wenn ihr mir ein paar meiner fragen beantworten könntet.



  • .file	"debugtest.c"
    	.section .rdata,"dr"
    LC0:
    	.ascii "Hallo du da\12\0"
    	.text
    .globl _WinMain@16
    _WinMain@16:
    	pushl	%ebp
    	movl	%esp, %ebp
    	subl	$8, %esp
    	movl	$LC0, (%esp)
    	call	_printf
    	movl	$0, %eax
    	leave
    	ret	$16
    

    Das ganze wird aufgerufen wenn ich WinMain(...) statt main() benutze.
    Warum fehlen hier die sachen sie im anderen Code ca. zeile 13-18 stehen?


Anmelden zum Antworten