Da die Tabellen so etwas Unübersichtlich sind habe ich noch Kommentaren hinzugefügt.
tss1ds: ;5
dw 0x68 ;Größe der TSS (min. 68h)
dw tss1 ;Offset Adresse der TSS
db 1,10001001b ;Code beginnt bei 0x10000 P,DPL,S,Type(1001)
dw 0 ;G,D,0,AVL,Größe Startadresse
tss1:
dd 0 ;BackLink(autogesetzt) & 0
dd 0x2FFFFF ;ESP0
dw 10000b,0 ;SS0 & 0 (Alle SS mit desc 2,4GB ansprechbar)
dd 0x3FFFFF ;ESP1
dw 10000b,0 ;SS1 & 0
dd 0x4FFFFF ;ESP2
dw 10000b,0 ;SS2 & 0
dd 0 ;CR3
dd 0 ;g+0x10000 ;EIP
dd 0x90200 ;EFLAGS
times 4 dd 0 ;EAX - EDX
dd 0x5fffff ;ESP
times 3 dd 0 ;EBP, ESI, EDI
dw 56,0 ;ES desc 7 (daten)
dw 48,0 ;CS desc 6 (code)
dw 16,0 ;SS desc 2 (daten für gesamten Speicher)
times 3 dw 56,0 ;DS, FS, GS (sieh ES)
dw 0,0 ;Backlink & 0
dd 0 ;LDT & 0
dd 0 ;I/O Port Bitmap Base & 0 & T(Interrupt 2)
Aber Ich bin jetzt etwas weiter gekommen, statt des Exception 13, Exception 6 aufgerufen wird. Es macht für mich kein Sinn warum Exception 6 aufgerufen wird (Befehl wird nicht unterstützt).
Da man mit Bochs etwas debuggen kann, in welcher reinfolge wird EIP, CS und Fehlercode auf den Stak gepuscht. Ich will noch mal sichergehen, dass ich den Task Wechsel richt vorgenommen habe, gazu muss ich doch mit LTR meinen ersten oder zweiten TSdesc aufrufen und dann mit Far Jump zum anderen springen.
Mov ax, 64 ;8 * 8
Ltr ax
Jmp 40:0 ;5 * 8