Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Assembler: Wie DS:DX eine Speicheradresse zuweisen?

Mdl / 6 Antworten / Baumansicht Nickles

Der Assembler-Sprache (inzwischen) fast gänzlich un-mächtig,hab ich's tatsächlich nicht hinbekommen, einen Interrupt (21h) aufzurufen: Es scheiterte an einer Zuweisung einer 32Bit-Adresse an DS:DX.

Wem diese Frage bekannt vorkommt oder wer den Hintergrund wissen will, bitte das kürzlich Posting 'SUBST in C' von mir (Mdl) aufrufen. An diesem Punkt sind wir leider steckengeblieben.

Hier nochmal kurz, wieweit der Int-21h - Aufruf schon mal funktioniert und was nicht klappt:

char buffer[MAX_PATH];

asm {
    mov ax, 71AAh;
    mov bh, 02h; // => 0: Create SUBST, 1: Terminate SUBST, 2: Query SUBST
    mov bl, 26; // DRIVE: 00=A:, ..., 26=Z

    // FEHLER! WIE GEHT DAS? 
    mov ds:dx, buffer; // DS:DX den Speicher von 'buffer' zuweisen...

    int 21h;
};

printf("SUBST of Z: is %s.", buffer);

Zur Erläuterung der ersten und letzten 'C'-Zeilen: Oben wird ein 32-Bit Speicher reserviert, dessen Inhalt dann angezeigt wird. Dem Assemblerteil in der Mitte obliegt es diesen zu füllen.

Die 32-Bit Adresse (= buffer) muss dazu an DS:DX übergeben werden.
Wie geht das?


Viele Grüße,

Mdl

bei Antwort benachrichtigen
dieBerylliumkigel Mdl „Assembler: Wie DS:DX eine Speicheradresse zuweisen?“
Optionen

Moin,

Die 32-Bit Adresse (= buffer) muss dazu an DS:DX übergeben werden.

ich wusste gar nicht, daß DOS mit 32 Bit adressiert.

Wozu gibt es die OFFSET Direktive im Assembler?

bei Antwort benachrichtigen
Mdl dieBerylliumkigel „Moin, ich wusste gar nicht, daß DOS mit 32 Bit adressiert. Wozu ...“
Optionen

Morgen,

Aha, da scheint jemand Bescheid zu wissen.

Wie muss ich also diese Problemzeile umändern?

Danke,

Mdl

P.S. Ich habe 32Bit geschrieben, weil ich in der Hilfe gelesen hatte, die ASM-Befehle gehen nur für 32Bit (und nicht 64Bit). Aber stimmt vermutlich, damals waren ja noch Segmenten und Offsets im Spiel. Idealerweise würde der Assemblercode aber sowohl für DOS als auch für die Windows-Console kompilierbar sein. Bisher war in meinem C-Prg. aber noch kein Assemblercode integriert, sodass ich mich um die interne Adressierung nicht weiter gekümmert habe...

bei Antwort benachrichtigen
mi~we Mdl „Assembler: Wie DS:DX eine Speicheradresse zuweisen?“
Optionen

Jetzt hab ich dazu doch noch was gefunden. Schau mal, ob dir hiervon was weiterhilft:

http://stackoverflow.com/questions/2617907/using-9-function-of-21h-interrupt-in-c

"Es wäre dumm, sich über die Welt zu ärgern. Sie kümmert sich nicht darum." (Marc Aurel)
bei Antwort benachrichtigen
Mdl mi~we „Jetzt hab ich dazu doch noch was gefunden. Schau mal, ob dir ...“
Optionen

Hi mi~we,

habe das Bsp. an meinen Code angepasst und bekomme aber eine Zugriffs-Exception bei 
  lds dx,...

Hier mal der angepasste Code:

char h_buffer[MAX_PATH];
FAR char *buffer=h_buffer;

asm {
    mov ax, 71AAh;
    mov bh, 02h; // => 0: Create SUBST, 1: Terminate SUBST, 2: Query SUBST
    mov bl, 26; // DRIVE: 00=A:, ..., 26=Z

    // FEHLER! WIE GEHT DAS?    
    // Access-Violation (read of address 0xffffffff)
    lds dx, buffer; // DS:DX den Speicher von 'buffer' zuweisen...

    int 21h;
};

printf("SUBST of Z: is %s.", buffer);

Habe auch das dort angegebene Beispiel ausprobiert und bekomme an derselben Stelle die Exception.

Aber ich probiere noch ein bisschen...

Gruß.

Mdl

bei Antwort benachrichtigen
dieBerylliumkigel mi~we „Jetzt hab ich dazu doch noch was gefunden. Schau mal, ob dir ...“
Optionen

ich packe das hier dazu:

http://zeus.nyf.hu/~bajalinov/OS/08/Interruptions/Interrupption%20INT%2021h.pdf

da sind so viele schöne Snippets drin.

sodass ich mich um die interne Adressierung nicht weiter gekümmert habe

Beim assemblern ist das tödlich.

Ist mir eh ein Rätsel, warum du das SUBST in einem Prorgramm verstecken  musst.

Obfuskation? Ein Batchfile kann das auch.

So ein Batch läuft unter DOS und Windows, im 16- und im 32-Bit Modus.

Und das in einer einzigen Zeile! He, he.

bei Antwort benachrichtigen
Mdl dieBerylliumkigel „ich packe das hier dazu: http://zeus.nyf.hu/ ...“
Optionen

Hi Berylliumkugel,

danke für die Infos. Da hab ich ja einiges durchzuackern. Aber Snippets sind immer gut!! Mal die Woche sehen, ob ich es in meinen CPPBuilder-Compiler einbauen kann, insbes. die Pseudokommandos...

Beim assemblern ist das tödlich.

Auch bei 'C', aber da bin ich eben versiert und bei Assembler nicht...

 

Zu den Gründen - schon interessant, dass die meisten Kommentare das WARUM behandeln und nicht das WIE - diesmal anders als schon im anderen Posting erklärt:

Ich brauche in einem C-Prg. die Implementierung einer Funktion:

  char *get_subst(char drive_letter);

also eine Funktion, der ich einen Laufweksbuchstaben übergebe und die mir, falls dieses Laufwerk ein mit SUBST erzeugtes virtuelles Laufwerk ist, den Pfad zurückgibt (, ansonsten NULL). Wenn ich die ohne Einbindung von Windows habe, ist die Aufgabe gelöst. Das ist natürlich NICHT die einzige Funktionalität des Programms, nur ein kleines Zahnrädchen...

Gruß,

Mdl

bei Antwort benachrichtigen