_Start code information
Nigel Murphy
murphyn@microsense.co.uk
Mon Jun 16 16:39:00 GMT 2003
Dear GNUs,
I'm looking for some information on what code should be used before
calling main. My problem is as follows, I'm trying to write code for a i486
system, that boots from a ROM. I've got code to boot the main system board
and get the processor running. The boot code copies a section of executable
code from the rom to 10000h in memory and then calls it.
This boot code works lovely! I've tried a bit of low level to output post
codes to port 80h with great success. Then I installed a cross compiler,
'i486-coff', and wrote a bit of C.
I've compiled code using the command
i486-coff-gcc -nostdlib -Tmemoryscript.ld flashGPIO.c
This compiles but gives an error about not finding _start and relocates
the start of the code to 10000h. This seems OK, but the code dosen't work
on the target system, so I had a look at the dissembly of the code to find
this :-
a.out: file format coff-i386
Disassembly of section .text:
00010000 <main>:
10000: 55 push %ebp
10001: 89 e5 mov %esp,%ebp
10003: 83 ec 08 sub $0x8,%esp
10006: 83 e4 f0 and $0xfffffff0,%esp
10009: b8 00 00 00 00 mov $0x0,%eax
1000e: 29 c4 sub %eax,%esp
10010: e8 47 00 00 00 call 1005c <__main>
10015: a0 aa 00 00 00 mov 0xaa,%al
1001a: e6 80 out %al,$0x80
1001c: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)
10023: 81 7d fc fd ff ff 7f cmpl $0x7ffffffd,0xfffffffc(%ebp)
1002a: 7e 02 jle 1002e <main+0x2e>
1002c: eb 0e jmp 1003c <main+0x3c>
1002e: a0 11 00 00 00 mov 0x11,%al
10033: e6 80 out %al,$0x80
10035: 8d 45 fc lea 0xfffffffc(%ebp),%eax
10038: ff 00 incl (%eax)
1003a: eb e7 jmp 10023 <main+0x23>
1003c: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)
10043: 81 7d fc fd ff ff 7f cmpl $0x7ffffffd,0xfffffffc(%ebp)
1004a: 7e 02 jle 1004e <main+0x4e>
1004c: eb ce jmp 1001c <main+0x1c>
1004e: a0 22 00 00 00 mov 0x22,%al
10053: e6 80 out %al,$0x80
10055: 8d 45 fc lea 0xfffffffc(%ebp),%eax
10058: ff 00 incl (%eax)
1005a: eb e7 jmp 10043 <main+0x43>
0001005c <__main>:
1005c: 55 push %ebp
1005d: 89 e5 mov %esp,%ebp
1005f: 5d pop %ebp
10060: c3 ret
10061: 8d 76 00 lea 0x0(%esi),%esi
Disassembly of section .data:
My feeling is that the code is not working because :-
1) the code/data/other segments aren't set
2) The stack pointer gets changed at the start of the code above, but
before 'Main'
Is there some 'Special' code I require before 'Main' and after '_start' to
setup the enviroment for 'main'?
Why does the compiled code play wih ESP/EBP registers?
Ta. Thanks for your time. Nigel.
------
Want more information? See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sources.redhat.com
More information about the crossgcc
mailing list