Autor Thema: Probleme mit Variablen  (Gelesen 4916 mal)

kotzkroete

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« am: 19. May 2007, 17:58 »
Hallo,
ich hab zwar schon einem anderen Thread geschrieben, aber ich denk, ich mach lieber einen neuen auf. Ist ja ein anderes Problem.
Also...ich schaffe es neuerdings nicht mehr, einige Variablen zu laden. Beispiel:
asdf dd 0
csr_x dd 0
csr_y dd 0
diese Variablen habe ich deklariert. Wenn ich jetzt csr_x bzw. y nach eax verschiebe, steht darin der Wert 0, so wies sein soll. Wenn ich aber nun asdf nach eax verschiebe, steht was ganz anderes drin....sollte ja eigentlich alles 0 sein, aber da stehen dann irgendwelche zufallszahlen drin. \

mov dword eax, [asdf]
schreibt unsinn nach eax

mov dword eax, [csr_x]
schreibt den Wer von csr_x nach eax

Wie kann denn sowas moeglich sein?

Edit: Wie so oft, kommt mir immer dann die Loesung, nachdem ich was gepostet habe. Undzwar funktoniert es, wenn ich erst einen Wert in die Variable reinschreibe. Aber das solls ja auch nicht sein. Ich will ja nicht erst etwas in die Variablen schreiben muessen, um sie spaeter korrekt lesen zu koennen. Also geloest hab ich mein Problem noch nicht.

Edit2: Hier mal der Code des Kernels...der wird vielleicht helfen:
http://rafb.net/p/qWR6xO64.html
« Letzte Änderung: 19. May 2007, 20:14 von kotzkroete »

Korona

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 19. May 2007, 22:42 »
Die Variablen sind alle im text Segment, nicht in rodata o.a. und werden auf nicht mit resd etc. initialisiert?
Dann kann es nur daran liegen, dass du die Variablen irgentwo überschreibst. (Oder falsche Addressierung durch falsche GDT Segmente oder Paging etc.)
Es könnte auch sein, dass der entsprechende Kernelteil überhaupt nicht vom Loader geladen wird. Mit times 1024-($-$$) db 0 erreichst du dass die Dateigröße 1024 Bytes ist. Ein Sektor ist nur 512 Byte.
Omg, jetzt hab ich den Post schon 3x geändert. Zu was für einer Binärdatei wird dein Code assembliert? Er muss an die Position gelinkt werden an der er ausgeführt wird. Entweder durch org <base-addresse> oder durch einen Linker.
« Letzte Änderung: 19. May 2007, 22:48 von Korona »

kotzkroete

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 20. May 2007, 10:08 »
Also das zum Schluss habe ich nur, dass ich keine ungeraden Dateigroessen spaeter habe. Weil qemu will immer nur ganze Sektoren laden. Und so muss ich eben die Datei nicht immer manuell mit nullen auffuellen.

Ja...also assemblen tu ich den zu 'ner bin. Eine bin hat doch garnicht solche text segmente und so, oder? Jedenfalls ging das im real mode immer perfekt. Aber der protected mode ist ja auch anders.

Koenntest du vielleicht den code mal an der entsprechenden Stelle so abaendern, dass es funktionert/funktionieren muesste ?
Ich kann dir gerne den ganzen source und die binaerdatei geben, wenn du das brauchst.

Korona

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 20. May 2007, 11:35 »
Wenn du ihn zu einer bin assemblierst muss oben
org 0x10000Wobei du 0x10000 durch die Addresse ersetzten musst, wo der Code hingeladen wird.

kotzkroete

  • Beiträge: 29
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 20. May 2007, 12:57 »
Achso....ja...stimmt das ergbit Sinn....dann muss ich mal sehen, wohin der code geladen wird.

Edit: gut...es geht, danke
« Letzte Änderung: 20. May 2007, 13:09 von kotzkroete »

 

Einloggen