Was ist int86()????



  • Hallo C++ Gemeinde,

    Im Rahmen eines Schulprojektes arbeite ich an einer Portierung eines DOS - Programms ins Windows.
    Dabei bin ich auf das Befehl

    int86(0x16, &Reg, &Reg);
    

    gestoßen.
    Hier meine Fragen:

    - Was ist das für ein Befehl?
    - Was verbirgt sich unter der 0x16 Adresse?

    Für Oure Antworten wäre ich dankbar.

    MfG
    Majestic 😕



  • erstmal zur ersten frage ... aus meiner djgpp hilfe 😉

    int86
    Syntax
    #include <dos.h>
    
    int int86(int ivec, union REGS *in, union REGS *out);
    
    Description
    The union REGS is defined by <dos.h> as follows: 
    
    struct DWORDREGS {
      unsigned long edi;
      unsigned long esi;
      unsigned long ebp;
      unsigned long cflag;
      unsigned long ebx;
      unsigned long edx;
      unsigned long ecx;
      unsigned long eax;
      unsigned short eflags;
    };
    
    struct DWORDREGS_W {
      unsigned long di;
      unsigned long si;
      unsigned long bp;
      unsigned long cflag;
      unsigned long bx;
      unsigned long dx;
      unsigned long cx;
      unsigned long ax;
      unsigned short flags;
    };
    
    struct WORDREGS {
      unsigned short di, _upper_di;
      unsigned short si, _upper_si;
      unsigned short bp, _upper_bp;
      unsigned short cflag, _upper_cflag;
      unsigned short bx, _upper_bx;
      unsigned short dx, _upper_dx;
      unsigned short cx, _upper_cx;
      unsigned short ax, _upper_ax;
      unsigned short flags;
    };
    
    struct BYTEREGS {
      unsigned short di, _upper_di;
      unsigned short si, _upper_si;
      unsigned short bp, _upper_bp;
      unsigned long cflag;
      unsigned char bl;
      unsigned char bh;
      unsigned short _upper_bx;
      unsigned char dl;
      unsigned char dh;
      unsigned short _upper_dx;
      unsigned char cl;
      unsigned char ch;
      unsigned short _upper_cx;
      unsigned char al;
      unsigned char ah;
      unsigned short _upper_ax;
      unsigned short flags;
    };
    
    union REGS {
      struct DWORDREGS d;
    #ifdef _NAIVE_DOS_REGS
      struct WORDREGS x;
    #else
    #ifdef _BORLAND_DOS_REGS
      struct DWORDREGS x;
    #else
      struct DWORDREGS_W x;
    #endif
    #endif
      struct WORDREGS w;
      struct BYTEREGS h;
    };
    
    Note: The .x. branch is a problem generator. Most programs expect the .x. 
    branch to have e.g. ".x.ax" members, and that they are 16-bit. If you know you 
    want 32-bit values, use the .d.eax members. If you know you want 16-bit values,
    use the .w.ax members. The .x. members behave according to #defines, as 
    follows: 
    
    default 
    If you specify no #define, the .x. branch has "ax" members and is 32-bit. This 
    is compatible with previous versions of djgpp. 
    _NAIVE_DOS_REGS 
    This define gives you .x.ax, but they are 16-bit. This is probably what most 
    programs ported from 16-bit dos compilers will want. 
    _BORLAND_DOS_REGS 
    This define gives you .x.eax which are 32-bit. This is compatible with 
    Borland's 32-bit compilers. 
    This function simulates a software interrupt. Note that, unlike the __dpmi_int 
    function, requests that go through int86 and similar functions are specially 
    processed to make them suitable for invoking real-mode interrupts from 
    protected-mode programs. For example, if a particular routine takes a pointer 
    in BX, int86 expects you to put a (protected-mode) pointer in EBX. Therefore, 
    int86 should have specific support for every interrupt and function you invoke 
    this way. Currently, it supports only a subset of all available interrupts and 
    functions: 
    
    1) All functions of any interrupt which expects only scalar arguments registers 
    (i.e., no pointers to buffers). 
    
    2) In addition, the following functions of interrupt 21h are supported: 9, 39h, 
    3Ah, 3Bh, 3Ch, 3Dh, 3Fh, 40h, 41h, 43h, 47h, 56h. 
    
    When the interrupt is invoked, the CPU registers are copied from in. After the 
    interrupt, the CPU registers are copied to out. 
    
    This function is just like int86x (see section int86x) except that suitable 
    default values are used for the segment registers. 
    
    See also section int86x, section intdos, and section bdos. 
    
    Return Value
    The returned value of EAX. 
    
    Portability
    not ANSI, not POSIX 
    
    Example
    union REGS r;
    r.x.ax = 0x0100;
    r.h.dl = 'c';
    int86(0x21, &r, &r);
    

    ps: wie wärs, die portierung der einfacherheit halber mit dem djgpp vorzunehmen?

    [ Dieser Beitrag wurde am 21.02.2003 um 18:20 Uhr von elise editiert. ]



  • Hallo,

    vielen Dank elise für den Auszug aus der Hilfe.
    Endlich weis ich was Das ist. Ich habe leider keinen Zugang zu djgpp.
    Ich habe lediglich den Borland C++ Builder 5, meine Aufgabe und das Quellcode des Programms.

    Für jede Hilfe bin ich sehr dankbar.

    Gruß
    Majestic 🙂



  • 16 ist tastatur nach auskunft meines freundes

    hier ein auszug:

    REGS wird verwendet, um für Interrupt-Funktionen wie int86 die Register des Prozessors zu belegen. REGS enthält dabei einmal eine Struktur für die sog. Byte-Register (Typ BYTEREGS, Elementname h) und eine Struktur für die sog. Word-Register (Typ WORDREGS, Elementname x), welche beide die jeweils entsprechenden Registernamen enthalten. Um also das Byteregister AH mit einem Wert zu belegen, schreibt man Regs.h.ah=ByteWert; . Analog dazu füllt man AX mittels Regs.x.ax=WordWert;.

    wenn du das programm umschreiben sollst, musst du mehr dazu sagen 🙂



  • Hallo,

    ist klar, aber wenn man so vor sich hin arbeitet, vergisst man, dass andere mehr Info brauchen, sorry!

    Das Prog ist nicht weltbewegend, vor einigen Jahren hatte es jemand an der Schule geschrieben.
    Damals noch XT-Zeit und rein DOS-Zeit, aber DOS existiert ja in seiner reinen Form ja zunehmend nicht mehr.
    Dadurch ist der Wunsch entstanden dieses Prog zu portieren.
    Soviel zur Vorgeschichte.
    Das Prog dient zur Simulation der Bewegungsabläufe (Positionierung, Fernsteuerung, etc.) mittels Schrittmotoren die an der LPT-Schnittstelle angeschlossen sind.
    Ein Funktionsablauf des Prog's sieht folgendermaßen aus:

    - Werte für das jeweilige Motor von der Konsole einlesen
    - Werte in Schritte umwandeln, evtl. Interpolation ausrechnen.
    - Timer initialisieren, dabei die geschw. des Rechners ermitteln (XT, AT), Verrechnungs-Konstante festlegen
    - Anfahr-, Brems- und Arbeitsrampen berechnen
    - Die Schnittstelle initialisieren und für eigene Zwecke umprogrammieren.
    - Den Drehsinn ermitteln aus Vorzeichen.
    - Timer starten
    - Einzelne Schritte an die Schnittstelle ausgeben
    - Timer stoppen
    - int86 -> jetzt weis ich was Das ist - bei Tastendruck sofort Abbruch!
    - Zähler erhöhen
    - nächster Schritt

    So im groben wäre es alles, der Rest ist nur Optik und Ergonomie.

    Soweit habe ich schon alles (denke ich zumindest 🙂 ), außer den Befehl int86 und den Timer, (da er unter Windows nicht der Echtzeit entspricht).
    In den nächsten Tagen werde ich es in den BCB reinhacken und schauen, ob ich tatsächlich alles habe!
    Den direkten Hardwarezugriff realisiere ich mit einer externen DLL, die unter W2K recht gute Dienste leistet.
    Was ich allerdings nicht habe sind die ganzen Speicheradressen im PC, falls jemand da eine gute Seite kennt ?

    Ich hoffe habe nichts vergessen!

    MfG
    Majestic 🙂



  • für eine schule ein total geiles projekt... *neid* 🙂



  • Brauchst Du aber nicht, es ist mit Arbeit verbunden. 😃

    In der Tat, der Projekt ist nicht von schlechten Eltern.

    Falls ich wieder auf einige Probleme stoße, poste ich mal wieder 😉


Anmelden zum Antworten