probleme mit stringausgabe im pmode..



  • hallo...

    ich bin gerade dabei an nen 32 bit os zu coden in nasm...
    is alles noch in der anfangsphase und muss erst so befehle wie gotoxy, putstr, gets , itoa ..usw. fuer den 32bit pmode hinbekommmen ... !
    und da sind wir auch schon gleich beim problem ...

    ich bekomm zum verrecken keinen string ausm code ausgegeben...!
    also in den 32bit code komm ich rein.. aber ich bekomm irgendwie die falsche stringadresse...

    bei mir sieht das etwa so aus:

    MainProc:

    mov eax, 16 ; init selectors
    mov ds, ax
    mov es, ax
    mov ss, ax

    mov eax, 0
    mov gs, ax
    mov fs, ax
    mov esp, 00007C00h

    ...
    ...
    push 0
    call clrscr

    mov edi, 0B8000h
    add edi, [cursor]
    lea esi, [boot1]
    store: lodsb
    mov ah, 09h
    stosw
    cmp al, 0
    jnz store

    inc edi
    mov [cursor], edi
    mov eax, 095Fh
    mov [edi], eax

    ...
    ...

    boot1 db "Starting fAr MCP v0.1",0
    ..
    ..

    cursor dd 0
    ..

    also er bekommt gleich beim ersten duchrgang schon 0 in al wodurch er gleich die schleife verlaesst..!
    ich hatte erst mov esi, boot1 stehen, dann dacht ich mir vielleicht bekommt er dann nur den offset aber nicht die vollstaendige adresse.. hmm..
    aber das lea hat auch nicht weitergeholfen..
    d.h. er kriegt definitiv die falsche adresse in esi

    ein direkte ausgabe wie mov eax, value .. stosw ... geht aber ..
    also die edi, esi register kann er scheinbar schon richtig ansprechen..

    hab keine ahnung an was es liegt, syntax ?
    vielleicht an der gdt .. das der code nicht auf read freigeschalten ist ?i

    mfg

    haMMer



  • Hi.

    Die Addresse wird im PM wie im RM aus einem Segment-Anteil und einem Offset gebildet.
    Dh. in esi kann und muss nur das Offset zu deinem String stehen.
    Folglich ist die Geschichte mit lea hier eigentlich unnuetz - das mov haette es auch getan.

    IMHO wird einfach bei deinem Code die Basisaddresse des Programms (angegeben durch die "Org"-Anweisung) mit der Basisaddresse des Descriptors hinter DS nicht uebereinstimmen.



  • ich sollte vielleicht anmerken, dass ich den kernel als elf format erstelle und dann mit ld zusammenlinke, rein aus dem grunde schon, damit ich mehrere module verwenden kann und nicht alles in eine datei reinknallen muss.

    der linker befehl sieht bei mir so aus:
    ld -e 0x00009000 kernel.o lib.o --oformat binary -o kernel

    somit dachte ich dass durch den entry point von 9000 alles gegessen waere...
    elf format laesst keine org anweisung zu...

    also eigentlich sollte es schon gehen, wenn in ds der richtige selector eingetragen ist und der descriptor in der gdt auch stimmt.
    also ich arbeite im flat model.. alles faengt bei 0 an.

    hab sos gefuehl ich muss mal checken ob der ueberhaupt die gdt richtig einlaedt ........
    d.h. ob in gdtr ueberhaupt die base addr von der tabelle drin is..

    mfg


Anmelden zum Antworten