Eigenen Interrupt
-
auf programmersheaven.com gibts irgendwo nen code, um den interrupt 9 zu verbiegen zur tastaturabfrage, da kannste gut von lernen.
-
hier ist das ding: <a href="http://www.programmersheaven.com/d/click.aspx?ID=F1430">klick</a>
aber in dem ding wird alles mit int 21h gemacht. Wo genau befindet sich denn diese Interrupt Vector Table?(heißt doch so oder?) und wie genau ist diese aufgebaut? ich nehme mal an da werden grad die addressen der interrupt-handler gespeichert oder?
Marcel
-
sowas *g*
funzen hier nichmal links?
-
Doch, links gehen. HTML geht jedoch nicht
Versuch doch mal die buttons unten zu benutzen, oder nimm direkt den ubb-code.
den hier:Text
Was deine Frage angeht:
In welchem System willst du interrupt-hanldes installieren bzw. in welchem CPU-Modus? (Real oder Protected? - ersteres ist schnell erklärt)
-
hi...
ok ab sofort nehm ich die button da unten
also ich hätte gern nen interrupt-handler im realmode
Marcel
-
Hi.
Im Realmode liegen in der sg. Interruptvectortabelle fuer die Interrupts 00 bis FF einfach FAR-Zeiger hintereinander. Die Tabelle beginnt bei 0000:0000 mit dem Zeiger auf die Behandlung von int 00h und endet bei 0000:0400 (4Byte * 100h Interrupts)
Kleines Beispiel:
IDEAL P186 MODEL TINY dataseg MSG1 db "Das hier ist Funktion 00h. ;)",0Dh,0Ah,24h MSG2 db "Und das hier Funktion 01h... Geil Wa?",0Dh,0Ah,24h codeseg org 100h start: push ds ;ds sichern mov ax,0000h mov ds,ax ;Segment 0000 mov bx,[0140h] ;Pointer zu Interrupt 50h sichern (4*50h=140h) mov cx,[0142h] mov [word ptr 0140h],offset TestInt ;Offset zur neuen Interruptbehandlungsroutine eintragen mov [0142h],cs ;Segment eintragen... ;nun ein wenig mit dem installierten Interrupt herumspielen... :) mov ah,00h int 50h inc ah ;=>ah=01 int 50h ;vorherigen int 50h-Handle installieren... mov [0140h],bx mov [0142h],cx pop ds ;ds wieder herstellen ret ;fuehrt hier einen Sprung auf cs:0000h aus, wo im PSP bekanntlich die Instruktion int 20h steht=>Programm beenden ;Prozedur fuer den Test-Interrupt Proc TestInt push ds ;ds sichern push cs pop ds ;ds zeigt wieder aufs Programmsegment push ax push dx ;uebrige Register sichern, die veraendert werden. ;pruefen, ob ah=0 ist test ah,ah jnz short @@Function1 ;ja: Msg1 auf den Bildschirm schreiben mov ah,09h mov dx,offset Msg1 int 21h jmp short @@Exit0 @@Function1: ;ah war ungleich 0=>Msg2 schreiben... mov ah,09h mov dx,offset Msg2 int 21h @@Exit0: ;gesicherte Register wiederherstellen... pop dx pop ax pop ds ;Interrupt wird durch iret beendet. iret ENDP TestInt END Start
-
was ist hieran falsch? immer wenn ich das von meinem Bootloader lade kommen komishce Zeichen die ganze Zeit
main: mov ax, cs
mov ds, ax
mov es, ax
cli
mov ss, ax
mov sp, StackEnd
sti
mov ax,[inter]
mov [0084h],ax
mov [0086h],cs
;------------------------------= Int 21h =----------------------------------------------
mov ah, 00h
int 21h
jmp a20
inter:
cmp ah, 00h
je printv
cmp ah, 01h
je printf
IRET
printv:
mov si, OpenOsVersion
call message
ret
printf:
call message
ret
-
Hi.
Soweit ich diesen Code interpretieren konnte, liegt hier ein Fehler bei der Installation des Offsets vom Handler vor.
mov ax,[inter]
Dieser Code kopiert den Speicherinhalt beim Offset "inter".
Gebraucht wird zur Installation des Interrupts jedoch das Offset der Behandlungsroutine selbst
Klartext: Falls es sich hier um NASM handelt, lass einfach die eckigen Klammern weg. (Dann brauchts auch nicht mehr den Umweg ueber ax, fixe Werte koennen direkt in den Speicher geschrieben werden)[edit]
Da faellt mir noch etwas auf:printv: mov si, OpenOsVersion call message ret printf: call message ret
wieso stehen hier auf einmal nur "ret"-OpCodes? Da gehoeren auch "iret"s hin.
[ Dieser Beitrag wurde am 27.05.2003 um 20:08 Uhr von Nobuo T editiert. ]
-
operation size not specfied kommt wenn ich die klammern weg lass und das direkt schreib.. (NASM!)
MFG
LordHoto
-
ups foll vergessen *g*
MFG
LordHoto
-
Hast du eigentlich schonmal die Doku zum NASM gelesen?
So sollte es gehen:mov word [0084h],inter
-
um jetzt ehrlich zu sein nein...
MFG
LordHoto
-
es funzt jetzt zwar etwas aber auch nich ganz...
ich ruf den int auf und danach jump ich wohin aber er jumpt erst und dann zeigt er das an und der letzte jump funzt auch netMFG
LordHoto
-
Original erstellt von <LordHoto>:
es funzt jetzt zwar etwas aber auch nich ganz...
ich ruf den int auf und danach jump ich wohinBis hierhin noch verstaendlich... aber dann peil ichs leider nicht mehr so richtig:
aber er jumpt erst und dann zeigt er das an
Wie kannst du feststellen, dass zuerst der Jump ausgefuehrt und anschliessend der Text auf dem Bildschirm ausgegeben wurde?
und der letzte jump funzt auch net
Seh ich nicht, kann ich also auch nichts zu sagen.
Dieses Codeschnipsel, dass du gepostet hast sollte jetzt jedenfalls Fehlerfrei sein.[ Dieser Beitrag wurde am 27.05.2003 um 20:37 Uhr von Nobuo T editiert. ]
-
Also hier mal der ganze Code :
[BITS 16]
group DGROUP _TEXT _DATA _BSS _STACKextern _main
; ****************************CODE-Segment*********************************
segment _TEXT class=CODE
..start:
main: mov ax, cs
mov ds, ax
mov es, ax
cli
mov ss, ax
mov sp, StackEnd
sti
mov word [0084h],inter
mov [0086h],cs
call _main.hang: jmp .hang
;------------------------------= Int 21h =----------------------------------------------
inter:
cmp ah, 00h
je printv
cmp ah, 01h
je printf
IRET
printv:
mov si, OpenOsVersion
call message
IRET
printf:
call message
IRET
;------------------------------= Int 21h =----------------------------------------------message:
lodsb
cmp al, 00h
jz putstrd
mov ah,0Eh
int 10h
jmp message
putstrd: ret; ****************************DATA-Segment*********************************
segment _DATA class=DATA
;------------------------------= Int 21h =----------------------------------------------
OpenOsVersion db "OpenOs Build 00.00.01",13,10,0
;----------------------------------------------------------------------------------------; ****************************BSS-Segment**********************************
segment _BSS class=BSS; ****************************STACK-Segment********************************
segment _STACK class=STACK
resw 512
StackEnd:so aber er jumpt jetzt ein paar mal zu der funktion main nur er führt sie nie vollständig aus... woran kann das liegen? (main ist in C geschrieben hat aber vor dem int zeug funktioniert, da es den int 21 (ich hoffe den hab ich erstellt *G*) nicht benutzt...)
MFG
LordHoto
-
Ist das da jetzt direkt der Code aus dem Bootstrap? Wenn nicht: wie ist cs beim Aufruf dieses Codes gesetzt?
Worauf ich hinaus will: ds muss in deinem Code bei der Manipulation der Int-Vectoren null sein.
Was du da beschreibst klingt aber ganz so, als waere das irgendwie nicht der Fall.
-
nö ist es auch net...
das kommt direct NACH dem bootloader...MFG
LordHoto
-
Wie dem auch sei, ich hoffe du hast die Kernaussage meines letzten Posts verstanden und konntest deinen Code dementsprechend aendern.
Funktioniert es denn jetzt?
-
bin grad auf ner Lan und hab kein Bochs drauf...
MFG
LordHoto
-
also cs ist immernoch wie im bootsector
und wenn ds null ist gibts auch keinen unterschiedMFG
LordHoto