Autor Thema: strings in c kernel werden nicht ausgegeben......  (Gelesen 5160 mal)

bsunisol

  • Beiträge: 19
    • Profil anzeigen
Gespeichert
« am: 17. March 2007, 12:41 »
hallo,
ich habe mein problem aus dem letzten thread gelöst....
jetzt habe ich ein neues, und zwar:

bochs spring ordnungsgemäß in den c kernel und führt ihn aus.
nur stimmen meine pointer/variablen adressen nicht.
schaut es euch selber an:

char* VidMem = (char*)0x0B8000;
void printf( char* t );
void clrscr();


int main() {
char Text[] = "ABC";

clrscr();
printf( Text );

return 0;
}


void printf( char* t ) {
while( *t ){
*VidMem = *t;
t++; VidMem++;
*VidMem = 0x07;
VidMem++;
}
}


void clrscr() {
VidMem = (char*) 0x0B8000;
int i = 0;

while( i < 4000 ) {
VidMem[i++] = 0;
}
}

das bildschirmlöschen funktionniert. aber er gibt nur ein großes S auf dem bildschirm aus. macht aber keine fehlermeldung.

wenn ich per debugger durch gehe dann sagt er mir, er würde für den string die adresse 210 nehmen.....

hier mein linker script:

OUTPUT_FORMAT("binary")
INPUT(BINARIES\OSLDR32.obj BINARIES\OSLDRC.obj)
ENTRY(start)
SECTIONS
{
  .text  0x200 : {
    code = .; _code = .; __code = .;
    *(.text)
    . = ALIGN(1);
  }
  .data  : {
    data = .; _data = .; __data = .;
    *(.data)
    . = ALIGN(1);
  }
  .bss  :
  {
    bss = .; _bss = .; __bss = .;
    *(.bss)
    . = ALIGN(1);
  }
  end = .; _end = .; __end = .;
}

mfg und danke im voraus
Uni_Sol

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #1 am: 17. March 2007, 12:45 »
Ergänze mal dein Linkerscript folgendermassen:

  .rodata  : {
    *(.data)
    . = ALIGN(1);
  }

bsunisol

  • Beiträge: 19
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 17. March 2007, 13:03 »
hmm geht trotzdem nicht.
gleiche sache wie vorher....

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #3 am: 17. March 2007, 13:18 »
    *(.data)
Das sollte eigentlich auch *(.rodata) heissen.

Wenn das nichts hilft, dann schaue dir mal die ausgabe von "objdump -t OSLDRC.obj" an.

bsunisol

  • Beiträge: 19
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 17. March 2007, 13:37 »
ähhh ja ich kann nur nicht viel mit dem ganzen krams anfagen.....

BINARIES\tmp\OSLDRC.obj:     file format coff-go32

SYMBOL TABLE:
[  0](sec -2)(fl 0x00)(ty   0)(scl 103) (nx 1) 0x00000000 OSLDRC.c
File
[  2](sec  1)(fl 0x00)(ty  24)(scl   2) (nx 1) 0x00000004 _main
AUX tagndx 0 ttlsiz 0x1e lnnos 410 next 10
_main :
   2 : 0x8
   4 : 0x10
   5 : 0x15
   8 : 0x1e
[  4](sec  1)(fl 0x00)(ty   0)(scl 101) (nx 1) 0x00000004 .bf
AUX lnno 6 size 0x0 tagndx 0 endndx 12
[  6](sec -2)(fl 0x00)(ty  32)(scl   1) (nx 1) 0xfffffffc _Text
AUX lnno 0 size 0x4 tagndx 0
[  8](sec  1)(fl 0x00)(ty   0)(scl 101) (nx 1) 0x00000022 .ef
AUX lnno 8 size 0x0 tagndx 0
[ 10](sec  1)(fl 0x00)(ty  21)(scl   2) (nx 1) 0x00000022 _printf
AUX tagndx 0 ttlsiz 0x34 lnnos 440 next 18
_printf :
   2 : 0x28
   3 : 0x2d
   4 : 0x34
   3 : 0x35
   4 : 0x37
   5 : 0x45
   6 : 0x49
   8 : 0x54
[ 12](sec  1)(fl 0x00)(ty   0)(scl 101) (nx 1) 0x00000022 .bf
AUX lnno 24 size 0x0 tagndx 0 endndx 20
[ 14](sec -2)(fl 0x00)(ty  12)(scl   9) (nx 0) 0x00000008 _t
[ 15](sec -2)(fl 0x00)(ty  12)(scl   4) (nx 0) 0x00000001 _t
[ 16](sec  1)(fl 0x00)(ty   0)(scl 101) (nx 1) 0x00000056 .ef
AUX lnno 8 size 0x0 tagndx 0
[ 18](sec  1)(fl 0x00)(ty  21)(scl   2) (nx 1) 0x00000056 _clrscr
AUX tagndx 0 ttlsiz 0x23 lnnos 494 next 25
_clrscr :
   3 : 0x57
   1 : 0x59
   2 : 0x5b
   6 : 0x65
   8 : 0x77
[ 20](sec  1)(fl 0x00)(ty   0)(scl 101) (nx 1) 0x00000056 .bf
AUX lnno 34 size 0x0 tagndx 0
[ 22](sec -2)(fl 0x00)(ty   4)(scl   4) (nx 0) 0x00000002 _i
[ 23](sec  1)(fl 0x00)(ty   0)(scl 101) (nx 1) 0x00000079 .ef
AUX lnno 8 size 0x0 tagndx 0
[ 25](sec  1)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x00000000 .text
AUX scnlen 0x79 nreloc 7 nlnno 20
[ 27](sec  2)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x00000080 .data
AUX scnlen 0x4 nreloc 0 nlnno 0
[ 29](sec  3)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x00000090 .bss
AUX scnlen 0x0 nreloc 0 nlnno 0
[ 31](sec  4)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x00000090 .comment
AUX scnlen 0xf nreloc 0 nlnno 0
[ 33](sec  2)(fl 0x00)(ty  12)(scl   2) (nx 0) 0x00000080 _VidMem

bsunisol

  • Beiträge: 19
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 17. March 2007, 14:41 »
haa
ich hab den fehler gefunden.
im linkerscript muss stehen

text 1200 und nicht 200 wie bei mir....


danke für die schnellen antworten.

 

Einloggen