Autor Thema: Externe Unterprogramme mit NASM  (Gelesen 30779 mal)

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #60 am: 11. May 2010, 10:41 »
Richtig. Der Prozessor springt da einfach hin, egal ob da nun Code ist oder nicht.
Im Speicher sein ist logisch, schließlich handelt es sich um die Syscall-Schnittstelle zum Kernel.

bscreator

  • Gast
Gespeichert
« Antwort #61 am: 18. May 2010, 20:11 »
Mal ne andere Frage:

bin mir nicht ganz sicher, aber mit
tabelle: times 10 db 0erstellt man glaub ich eine Tabelle namens tabelle, die 10 Bytes speichern kann und mit 0 initialisiert ist.

Ist es auch möglich, eine zweidimensionale Tabelle zu erstellen, d.h. eine Tabelle mit 2 Spalten, die z.B. in der 1.Spalte Byte-Werte speichert und in der 2.Spalte Word-Werte ?

Gruss,
bsc

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #62 am: 18. May 2010, 20:59 »
Hi,

ja es ist möglich.

tabelle:
spalte1: times 10 db 0
spalte2: times 10 dw 0

Oder

tabelle: times 10 db 0, 0, 0
Dann ist der i-te Eintrag in Spalte 1 halt [tabelle + i * 3] und der i-te Eintrag in Spalte 2 [tabelle + i * 3 + 1]

Und natürlich weitere Varianten.

bin mir nicht ganz sicher, aber mit
tabelle: times 10 db 0erstellt man glaub ich eine Tabelle namens tabelle, die 10 Bytes speichern kann und mit 0 initialisiert ist.

Das hier sind alles nur Folgen von Bytes. Dass meine Schnipsel es eine zweidimensionale Tabelle werden, ist nur das Resultat davon, wie du den Speicher adressierst.
« Letzte Änderung: 18. May 2010, 21:04 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

bscreator

  • Gast
Gespeichert
« Antwort #63 am: 18. May 2010, 21:22 »
Erstmal Danke für deine Hilfe, aber eins ist mir noch unklar:
Zitat
Dann ist der i-te Eintrag in Spalte 1 halt [tabelle + i * 3]

Warum multiplizierst du i mit 3 ? Ist der i-te Eintrag in Spalte 1 nicht [tabelle+i] ?

Gruss und danke,
bsc

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #64 am: 18. May 2010, 22:03 »
Hi,

tja das kommt auf die Interpretation an. Kann man auch mit [tabelle + i] machen. Dann liegt halt die zweite Spalte wo anders.
Dieser Text wird unter jedem Beitrag angezeigt.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #65 am: 18. May 2010, 23:22 »
Ob du deine zweidimensionale Tabelle (=Array) hochkant stellst oder quer hinlegst, bleibt dir überlassen. Betrachte es einfach als eine Folge von Bytes (=eindimensional), wo du aber das Blatt abschneidest und untereinander packst.

Solange du dich überall auf eine(!) Denkweise festlegst, hast du später weniger Probleme, wenn du den Code auch warten musst.

bscreator

  • Gast
Gespeichert
« Antwort #66 am: 19. May 2010, 08:01 »
Eigentlich wollt ichs hochkannt stellen, also zwei Spalten mit ca. 10 Zeilen.
Deshalb versteh ich auch nicht, warum es auf die Interpretation ankommt.
Zitat
Betrachte es einfach als eine Folge von Bytes (=eindimensional), wo du aber das Blatt abschneidest und untereinander packst.
Das mit der Folge von Bytes ist mir schon klar, aber warum liegt bei [tabelle+i]
Zitat
die zweite Spalte wo anders
?

Ich versteh eben nicht, was es mit der i*3 auf sich hat und warum dann die zweite Spalte woanders liegt. Die zweite Spalte liegt doch bei tabelle:
spalte1: times 10 db 0
spalte2: times 10 dw 0
normal an 2.Stelle, also auf deutsch nach der 1.Spalte, oder?

Sorry, aber an dieser Denkweise arbeit ich noch.
Gruss,
bsc

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #67 am: 19. May 2010, 12:23 »
Das i*3 kommt daher, dass du 3 Einträge in einer Zeile hast.

Du kannst hingehen und sagen "das i. Element der n. Spalte ist [tabelle+n*BYTEPROZEILE+i]" oder aber "das i. Element der n. Spalte ist [tabelle+i*BYTEPROSPALTE+n]", je nachdem, ob du die Tabelle hoch oder quer legst.    Entweder:                Oder:
    1   2   3                1   4   7
    4   5   6                2   5   8
    7   8   9                3   6   9

Was du im Speziellen einsetzt, hängt von deiner persönlichen Vorliebe ab; ich empfehle aber, konsistent zu bleiben. Beachte auch den Aufbau beim C-Compiler deines Vertrauens, damit sparst du dir später teure Konvertierungen, wenn du C und Assembler verbindest.

Gruß,
Sebastian

bscreator

  • Gast
Gespeichert
« Antwort #68 am: 19. May 2010, 16:30 »
Zitat
Das i*3 kommt daher, dass du 3 Einträge in einer Zeile hast.
Weil ein WORD im Speicher wie 2 Bytes gehandelt wird ?

Tabelle
4        2030
3        4000
7        1020
9        3342
1        4021
11       1231
2        3242
Also wenn ich jetzt die Zahl "1231" aus der Tabelle auslesen wollte, wäre [Tabelle+19], bzw. [Tabelle+6*3+1] richtig, wobei 6=Zeilennummer und 3=Bytes pro Zeile, oder (Wenn man davon ausgeht, dass man bei 1 anfängt zu zählen) ?


Zitat
das i. Element der n. Spalte
Ich denk immer in der Kategorie : "das i.te Element der n. Zeile"


Thanks,
bsc
« Letzte Änderung: 19. May 2010, 16:56 von bscreator »

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #69 am: 19. May 2010, 17:33 »
BYTE = 1 Byte, WORD = 2 Byte, DOUBLEWORD = 4 Byte, QUADWORD = 8 Byte.
Gilt in der Form uneingeschränkt nur auf x86-Assembler im 16-Bit-Modus.

Du zählst im Speicher grundsätzlich ab null (Basisadresse plus null), also ist das erste Element [tabelle+0].

Richtig ist also [tabelle+16] bzw. [tabelle+5*3+1].

bscreator

  • Gast
Gespeichert
« Antwort #70 am: 20. May 2010, 21:51 »
Ja genau, wenn man, wie es in der Informatik üblich ist, bei 0 anfängt.

Ich hab jetzt meinen BIN-Kernel in einen OBJ-Kernel umgewandelt. Aber leider startet jetzt mein Kernel nicht mehr.

Ich habs so mit NASM versucht:
nasm -f bin -o boot.bin boot.asm
nasm -f obj -o krl.obj krl.asm
copy boot.bin+krl.obj os.img

Aber leider erscheinen jetzt nur noch die Meldungen des Bootloaders, dann ist schon Ende.

Wie kann ich meinen OBJ-Kernel starten ?

Gruss,
bsc

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #71 am: 21. May 2010, 01:36 »
Siehe meine Antwort auf die PM. Bitte frage mich nicht direkt, sondern im Thread.

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #72 am: 21. May 2010, 07:29 »
Hallo,


Ich hab jetzt meinen BIN-Kernel in einen OBJ-Kernel umgewandelt.
Warum?

Aber leider startet jetzt mein Kernel nicht mehr.
Das ist auch nicht verwunderlich. Oder kann der Teil in boot.bin die krnl.obj passend interpretieren? Das OBJ-Format ist sowas ähnliches wie ELF. Ich glaube sogar das OBJ für diesen Zweck völlig ungeeignet ist weil OBJ nur zum linken und nicht zum direkten ausführen dient.

Bitte beschäftige Dich erst mal eingehend mit den verschiedenen Executable/Object-Formaten und dann am besten mit GRUB.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

bscreator

  • Gast
Gespeichert
« Antwort #73 am: 21. May 2010, 09:38 »
Zitat
Ich hab jetzt meinen BIN-Kernel in einen OBJ-Kernel umgewandelt.
Weil ich in meiner FLAT-Binary keine externen Variablen mit GLOBAL und EXTERN definieren kann und somit die ganzen Adressen "PER HAND" auflösen muss.

Zitat
Bitte beschäftige Dich erst mal eingehend mit den verschiedenen Executable/Object-Formaten und dann am besten mit GRUB.
Danke, aber mit GRUB werd ich mich nicht beschäftigen. Zum eigenen OS gehört (meiner Ansicht nach) auch ein eigener Bootloader.

Also ich brauch nur die Offsetadressen von ein paar externen Labels. Gibts da eine Möglichkeit in Bochs, das OS STEP BY STEP ausführen zu lassen und die Registerinhalte zu jedem STEP einzusehen ? Dann bräucht ich nicht jedesmal die ganzen Bytes zu zählen, bis ich beim Label bin, um zur Offset zu gelangen.

Gruss,
bsc

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #74 am: 21. May 2010, 11:44 »
Zitat
Ich hab jetzt meinen BIN-Kernel in einen OBJ-Kernel umgewandelt.
Weil ich in meiner FLAT-Binary keine externen Variablen mit GLOBAL und EXTERN definieren kann und somit die ganzen Adressen "PER HAND" auflösen muss.
Informiere dich mal weiter über Linker, und such bei denen die du findest nach einer Möglichkeit COM-Dateien zu erzeugen. Wenn du da mit den richtigen Parametern rangehst, solltest du das für einen Kernel verwenden können.

Gibts da eine Möglichkeit in Bochs, das OS STEP BY STEP ausführen zu lassen und die Registerinhalte zu jedem STEP einzusehen ?
Die Maschine im Bochs-Debugger starten. Mit dem Befehl lb 0x7c00 setzt du einen Breakpoint auf den Anfang des Bootsektors. (0x7c00 ist eine lineare Adresse. Du kannst auch einen Breakpoint auf den Kernel setzen, wenn du die Adresse entsprechend umrechnest.) Mit dem Befehl c (steht für continue) läuft dann die Maschine bis zum Breakpoint. Mit dem Befehl s (steht für step) kannst du einen Schritt ausführen (den angezeigten Befehl). Nach jedem Schritt kannst du dir mit regs die Register anzeigen lassen. Mit help bekommst du eine Befehlsübersicht. Mit z.B. help regs bekommst du eine Hilfe zu diesem Befehl. Die restlichen Befehle sind hier dokumentiert: http://bochs.sourceforge.net/doc/docbook/user/internal-debugger.html
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen