ok das erste hab ich nicht so wirklich verstanden : kann es sein dass im Protect mode dann das org eh nicht mehr zählt?
ok, fangen wir mit folgendem Code an (test1.asm):
[bits 16]
jmp 0x08:test
test:
Man beachte, dass das ein far-jump ist, wenn man das assembliert (nasm test1.asm -o blub1 -f bin) und anschließend wieder disassembliert (ndisasm blub1), dann ergibt sich folgendes:
00000000 EA05000800 jmp word 0x8:0x5
Machen wir nun das gleiche für diesen Code
[bits 16]
[org 0x7C00]
jmp 0x08:test
test:
ergibt sich hingegen
00000000 EA057C0800 jmp word 0x8:0x7c05
So, nun sieht man, dass im ersten Fall die Adresse des Labels 0x05 war im zweiten aber 0x7C00 + 0x05, d.h. genau das mehr was wir mit org angegeben haben. Das bedeutet also, dass der Assembler durch die org-Angabe weiß wie er die Adressen der Labels zu berechnen hat.
Jetzt sollte es hoffentlich offensichtlich sein, dass der Assembler - unter der Voraussetzung, dass deine Segmentdeskriptoren Basis 0 haben - auch im Protected-Mode die richtigen Adressen erzeugt, was natürlich optimal ist.
Aber was heißen eigentlich die Zahlen dannach (13,10,0)
13 = Carriage Return, an Position 0 der momentanen Zeile zurücklaufen
10 = Line feed, gleiche Position eine Zeile weiter unten
0 = Ende der Zeichenkette (für deine Ausgabefunktion relevant)
Und WIE genau, kann ich etwas debuggen?
Wenn du bochs mit Debugger startest (unter Windows dürfte das über bochsdbg oder bochs_dbg oder so gehen) dann kann man Breakpoints setzen, den Code bis dahin ausführen lassen, den Registerinhalt anschauen, Singlesteppen, d.h. Instruktionsweise den Code ausführen lassen und nach jeder Instruktion kann man wieder Register etc... anschauen.
Generell sollte bochs aber auch den Grund einer Exception ins Log/Bildschirm schreiben, falls man das "log level" (siehe bochs Konsolenmenü) bei "[CPU]" überall auf "report" stellt.
Unter qemu kann sich erstmal die Exceptions mittels "-d int" (als Kommandozeilenparameter) ins Log schreiben lassen. Dann kannst du bei deinen Assemblercode mal disassemblieren und schauen was an der Stelle so passiert.
Das wiki hat auch einen Eintrag zum Debuggen, nämlich
hier.