Eigenen Interrupt



  • 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 net 😞

    MFG

    LordHoto



  • Original erstellt von <LordHoto>:
    es funzt jetzt zwar etwas aber auch nich ganz...
    ich ruf den int auf und danach jump ich wohin

    Bis 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 _STACK

    extern _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 unterschied 😞

    MFG

    LordHoto



  • so das hier ist der richtige code!

    [BITS 16]
    group DGROUP _TEXT _DATA _BSS _STACK
    extern _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
    mov bx, 00h
    mov es, bx
    mov word [es:84h], INT21h
    mov [es:86h], cs
    sti
    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:


Anmelden zum Antworten