Interrupt-Vector?
-
@Anubis: Ich habe doch extra dazugeschrieben, dass ich KEINEN dos-int aufrufen kann. Damit meinte ich vorrangig den int 21h.
@Nobuo:
Ich habe es genauso gemacht wie du gesagt hast. Warum funktioniert folgender Code trotzdem nicht?.model tiny .386 .code org 0h Entry: jmp SkipData Message db "Kernel geladen!", 13, 10, 0 SkipData: assume cs:@code, ds:@code, es:@code mov ax, cs mov ds, ax mov es, ax assume ds:0 mov ax, seg TastaturHandler mov dx, offset TastaturHandler mov bx, 24h mov cx, 0h mov ds, cx mov ds:[bx], dx ; Erst das Offset mov ds:[bx+2], ax ; Dann das Segment des Handlers hang: jmp hang TastaturHandler proc far mov al, '!' mov ah, 0Eh mov bx, 7 int 10h iret TastaturHandler endp end Entry ; Der Einsprungpunkt ist nur gegeben, damit tasm nicht meckert
edit: Code tags richtiggemacht
[ Dieser Beitrag wurde am 01.06.2002 um 17:18 Uhr von cd9000 editiert. ]
-
Mein TASM compiler wollte den Code irgendwie nicht compilieren (war iergendein Fehler mit den zugewiesenen Segmentregistern )
Wie dem auch sei. ich habe mir mal erlaubt deinen Code ein bisschen umzuschreiben:IDEAL ;Ich find den MASM-Syntax einfach nur Schroecklich
model tiny
P386
codeseg
org 100h ;Ich hab das ganze als .com compiliert -> Start bei 100hEntry:
jmp short @@SkipDataMessage db "Kernel geladen!", 13, 10, 0
@@SkipData:
mov ax, cs
mov es, axxor ax, ax
mov ds, axmov [word ptr ds:0024h],offset TastaturHandler + 7B00h ; Erst das Offset + 7B00h, da Code an addresse 7C00h liegt und TASM sowieso schon 0100h zur Addresse addiert (siehe org 100h)
mov [word ptr ds:0026h],cs ; Dann das Segment des Handlers - ist imho gleich dem codesegmenthang:
jmp hangProc TastaturHandler
mov al, '!'
mov ah, 0Eh
mov bx, 7
int 10h
iret
Endp TastaturHandlerend Entry ; Der Einsprungpunkt ist nur gegeben, damit tasm nicht meckert
Ich habe das jetzt nicht getestet, sollte aber eigentlich laufen
-
Hmmmm...
Kernel.asm wird von meinem Bootsektor geladen, es liegt an der adresse 1000h:0000h = 10000h.mov [word ptr ds:0024h], offset TastaturHandler + 7B00h
Aber schau mal: Nehmen wir mal an offset TastaturHandler ergibt 31h. Jetzt noch 7B00 dazu ergibt 7B31. Segment gleich cs, also 7C0 (bei meinem bootsektor). 07C0:7B31 ergibt aber F731h. Da liegt sicher nicht der Handler.
Der Code wird übrigens ganz sicher ausgeführt, die Message wird ausgegeben (den print code hab ich nur weggelassen).
Nochmal der überarbeitete Code:
IDEAL model tiny P386 codeseg org 0h jmp 1000h:@@Entry ; Um sicherzugehen, dass das Segment 1000h ist @@Entry: assume cs:@code, ds:@code, es:@code mov ax, cs mov ds, ax mov es, ax ; Printcode der Message xor cx, cx mov ds, cx mov [word ptr ds:24h], offset TastaturHandler mov [word ptr ds:26h], seg TastaturHandler @@hang: jmp @@hang proc TastaturHandler mov al, '!' mov ah, 0Eh mov bx, 7 int 10h iret endp TastaturHandler end @@Entry
Was ist eigentlich der Unterschied des IDEAL-Modes gegenüber des "normalen" modes? Kennst du eine Seite auf der das beschrieben ist?
-
btw:
es funktioniert immer noch nicht.
Kam glaub ich im letzten Posting nicht rüber.
-
Es kam sehr wohl rueber (fuer mich zumindest) aber als Mod geht man lieber auf Nummer sicher...
Ich habe nun also erstmal einen Code geschrieben, der dir die Werte der Segmentregister bim Bootup ausgibt, wartet, bis eine Taste gedrueckt wird und neu bootet. (den hab ich auch getestet)
Code folgt:
IDEAL
model tiny
P386
codeseg
org 100hEntry:
jmp short @@SkipDataHexData0 db "0123456789ABCDEF"
Msgs0 db "CS:ES:DS:"@@SkipData:
cli
mov ax, cs
mov ss, ax
mov sp,0FFFEh
stipush ds
push es
mov ax, cs
mov ds, axmov ax,0B800h
mov es,axxor di, di
mov si,offset Msgs0 + 7B00h
mov cx,0003h
mov ah,0Ah
@@WriteL0:
lodsb
stosw
loop @@WriteL0mov bx, cs
call HexWord0
add di, 0008hmov si,offset Msgs0 + 7B03h
mov cx,0003h
mov ah,0Ah
@@WriteL1:
lodsb
stosw
loop @@WriteL1pop bx
call HexWord0add di, 0008h
mov si,offset Msgs0 + 7B06h
mov cx,0003h
mov ah,0Ah
@@WriteL2:
lodsb
stosw
loop @@WriteL2pop bx
call HexWord0xor ax,ax
int 16h
int 19hProc HexWord0 NEAR
mov cx,0004h
@@ConvertLoop0:
mov si,offset HexData0 + 7B00h
rol bx,04h
mov dx,bx
and dx,0004h
add si,dx
lodsb
stosw
loop @@ConvertLoop0
retENDP HexWord0
end Entry ; Der Einsprungpunkt ist nur gegeben, damit tasm nicht meckert
Wenn du das laufen laesst steht da folgendes auf dem Bildschirm:
cs:0000 ds:0000 es:0000
->nix mit code liegt bei 1000:0000
Vielleicht ist das aus meinem letzten Post so nicht hervor gegangen, aber der Code vom Bootsektor wird vom Bios nach 0000:7C00 kopiert.Aber schau mal: Nehmen wir mal an offset TastaturHandler ergibt 31h. Jetzt noch 7B00 dazu ergibt 7B31. Segment gleich cs, also 7C0 (bei meinem bootsektor). 07C0:7B31 ergibt aber F731h. Da liegt sicher nicht der Handler.
Falsch! es werden eben NICHT nur 7B00 dazugerechnet. Du musst auch noch org 100h beruecksichtigen. Org 100h addiert zu allen Addressen 100h dazu. => Addresse + 7C00 (da faengt der Code an) - 100h = 7B00h
Hoffe das war verstaendlich.Dann fehlt in deinem Code noch was wichtiges:
Die Stack initialisation. (Hab ich zuerst uebersehen, sry)Als naechstes poste ich dann eine getestete Version deines codes.
-
Du hast mich doch nicht richtig verstanden. Ich habe bereits einen funktionierenden Bootsektor. Dieser lädt meinen Kernel an die adresse 1000h:0h. (ganz sicher!). Der Bootloader liegt bei 0:7c00 das ist klar, aber mein kernel wird ja manuell an 1000:0 geladen.
Den interrupt kann ich immer noch nicht korrekt auf meinen Code umleiten
Den Stack initialisiere ich jetzt wie du gesagt hast.
-
Dann sag das doch Kann schliesslich keine Gedanken lesen
Egal. Es kann eigentlich nur noch an der Art und Weise liegen, in der du die Addresse deines Handlers bestimmst. Ich habe nun naemlich genau den Code, den ich oben gepostet hatte auf den Bootsektor gespiel und es hat funktioniertIch denke, dass am "seg TastaturHandler" liegt. Probier doch einfach mal cs oder gleich 1000h in den Interruptvector zu schreiben.
-
es will einfach nicht klappen!IDEAL model tiny P386 codeseg org 0h jmp 1000h:@@Entry @@Entry: mov [word ptr 0:24h], offset TastaturHandler mov [word ptr 0:26h], 1000h ; seg TastaturHandler sti ; Interrupts zulassen @@hang: jmp @@hang proc TastaturHandler int 19h ; neustart iret endp TastaturHandler end @@Entry
Sogar dieser kleine Code funktioniert einfach nicht
Aber woran kann das liegen?
-
Was passiert denn wenn man eine Taste drückt? Gar nichts?
Wilde Vermutung: Ich hab mal gehört es soll nicht so gut sein Interrupts innerhalb von Interrupts aufzurufen. Versuch doch mal deinen INT Aufruf zu simulieren (pushf, und dann ein FAR CALL).
-
Es passiert gar nix, das ist es ja
Das mit den Interrupts in Interrupts klingt für mich plausibel. Ich werds gleich mal testen. (Ich bin gerad an nem anderen Rechner).
-
Ok ich hab mal folgenden test-Code geschrieben:
IDEAL model tiny P386 codeseg org 0h @@Entry: jmp @@SkipData Message db "Kernel geladen!", 13, 10, 0 @@SkipData: assume cs:@code, ds:@code, es:@code mov ax, cs mov ds, ax mov es, ax mov eax, [0:19h*4h] ;mov [dword ptr Int19], eax mov [Int19], ax shr eax, 16 mov [Int19+2], ax pushf db 0FFh Int19 dw ?, ? end @@Entry
Da müsste doch eigentlich int 19h (neustart) aufgerufen werden? Aber es tut sich einfach nix
-
hm. der Opcode fuer den far call stimmt ja wohl auch net.
Ich wurde folgendes vorschlagen:IDEAL
model tiny
P386
codeseg
org 0h@@Entry:
jmp @@SkipData
Message db "Kernel geladen!", 13, 10, 0@@SkipData:
assume cs:@code, ds:@code, es:@code
mov ax, cs
mov ds, ax
mov es, axmov eax, [0:19h*4h]
mov [Int19], eax
pushf
call [dword ptr Int19]Int19 dd ?
end @@Entry
-
Ich habs hingekriegt! Nach einigen Stunden Ausprobierens.
IDEAL model tiny P386 macro NewLine mov al, 13 mov ah, 0Eh mov bx, 7 int 10h mov al, 10 mov ah, 0Eh mov bx, 7 int 10h endm NewLine codeseg org 0h @@Entry: jmp @@SkipData StartMsg db "Kernel geladen, cs = ", 0 @@SkipData: assume cs:@code, ds:@code, es:@code mov ax, cs mov ds, ax mov es, ax mov si, offset StartMsg call Print mov ax, 0 mov ds, ax mov ax, cs mov es, ax mov ax, [word ptr 24h] mov [es:OldInt9], ax mov ax, [word ptr 26h] mov [es:OldInt9+2], ax cli mov [word ptr 24h], offset Int21Handler mov [word ptr 26h], 1000h sti @@hang: jmp @@hang ; Erwartet die Adresse des auszugebenden nullterminierten Puffers in DS:SI proc Print far @@PrintLoop: lodsb cmp al, 0 je @@PrintEnde mov ah, 0Eh mov bx, 7 int 10h jmp @@PrintLoop @@PrintEnde: retf endp Print TasteGedrueckt db "Taste gedrueckt!", 0 proc Int9Handler far ; Den Original-Handler des BIOS aufrufen pushf db 09Ah ; far call OldInt9 dw ?, ? mov si, offset TasteGedrueckt iret endp Int9Handler end @@Entry
Ich weiß nicht so ganz wo der Fehler jetzt eigentlich lag. Vielleicht daran, dass ich nicht den alten int9 handler des BIOS aufgerufen habe.
Ist ja auch egal, hauptsache es klappt
-
Aja jetzt fällts mir wieder ein, der Fehler ist folgender:
[0:24h]
Das wird vom TASM seltsamerweise zu [ds:24h] ausgewertet. Und da ds natürlich nicht 0 war hat es nicht geklappt.
-
Das wuerde nicht nur TASM so interpretieren. Ein Speicherzugriff wird immer aus einem Segmentregister und dem Offset errechnet.
Ist mir gar nicht aufgefallen... In den ersten Codeausschnitten, die du gepostet hast, wars schliesslich auch noch richtig
-
Naja ich versteh ja auch nicht so ganz warum es nicht geklappt hat, aber das ist doch jetzt eh egal
Eine sache noch:
Wenn ich den alten Handler des BIOS nicht aufrufe, reagiert er auf einen einzigen Tastendruck und dann hängt er sich (anscheinend) auf und macht nix mehr. Was macht denn der Handler des BIOS so wichtiges?
-
Dann poste doch bitte nochmal den richtigen code bzw. berichtige den im letzten Post...
Da wird schliesslich irgendwie ein Offset von einem "Int21Handler" den ich da nirgends sehe in den Int9-Vector geschrieben und im int9Handler wird nur der alte int9 aufgerufen und dann si gesetzt. Also sollte eigentlich sowieso gar nichts passieren, wenn eine Taste gedrueckt wird.
-
Der Code war schon fast richtig:
IDEAL model tiny P386 macro NewLine mov al, 13 mov ah, 0Eh mov bx, 7 int 10h mov al, 10 mov ah, 0Eh mov bx, 7 int 10h endm NewLine codeseg org 0h @@Entry: jmp @@SkipData StartMsg db "Kernel geladen!", 0 @@SkipData: assume cs:@code, ds:@code, es:@code mov ax, cs mov ds, ax mov es, ax mov si, offset StartMsg call Print NewLine mov ax, 0 mov ds, ax mov ax, cs mov es, ax mov ax, [word ptr 24h] mov [es:OldInt9], ax mov ax, [word ptr 26h] mov [es:OldInt9+2], ax cli mov [word ptr 24h], offset Int9Handler mov [word ptr 26h], 1000h sti @@hang: jmp @@hang ; Erwartet die Adresse des auszugebenden nullterminierten Puffers in DS:SI proc Print far @@PrintLoop: lodsb cmp al, 0 je @@PrintEnde mov ah, 0Eh mov bx, 7 int 10h jmp @@PrintLoop @@PrintEnde: retf endp Print TasteGedrueckt db "Taste gedrueckt!", 0 proc Int9Handler far pusha push ds ; Den Original-Handler des BIOS aufrufen pushf db 09Ah ; far call OldInt9 dw ?, ? mov ax, cs mov ds, ax mov si, offset TasteGedrueckt call Print pop ds popa iret endp Int9Handler end @@Entry
-
hey,will auch
komisch auf die idee cs auszugeben bin ich auch mal gekommen ,allerdings gings bei mir um org 100h
wenn ich sowas lese kriege ich immer lustig auch wieder was zu machen und werde aktiv,ich hab s recht schnell hinbekommen aber es funzt nur einmal danach is sense!?.model tiny .code org 0100h START: jmp go go: mov ax,7b00h xor dx,dx mov bx,16 div bx push ax pop ds cli; mov ax,9000 mov ss,ax mov sp,00h sti; cld; call print cli xor ax,ax push ax pop es mov ax,4 mov bx,9 mul bx push ax pop di mov ax,offset key; add ax,7b00h stosw xor ax,ax stosw sti hang: jmp hang message db "Hello this is bigOS v0.002 and cs is: ",0 print: mov si, offset message xor di,di; read: lodsb mov ah,0eh or al,al jz ende int 10h jmp read; ende: push cs pop ax call intout; ret intout: ;parameter in ax!!!!!!! or ax,ax jz was_zero mov cx,5 mov bx,10000 loop________1: xor dx,dx div bx mov ah,0eh or al,al add al,48 int 10h mov ax,bx push dx xor dx,dx mov bx,10 div bx mov bx,ax pop ax loop loop________1 ret was_zero: zero_________2: mov ah,0eh add al,48 int 10h ret; key: mov al,'.' mov bl,33 mov ah,0eh int 10h; iret org 2feh db 0aah,055h END START
-
@ cd9000 das dein system ohne den orginal tastaturhandler nur ein zeichen auswertet und dann einfriert liegt daran, dass du auch die tastaturpuffer weieder freischalten must, und die interuptsperre wieder aufheben musst. ( letzteres weis ich nicht genau. was ein hwint alles macht. ersteres sind glaubich 2 bis 3 out befehle um den tastaturbaustein wieder entsprechend vorzubereiten.(müsste heut abend mal nachschauen, hab mal so nen tastaturhandler selber geschrieben))
gruss termite