Programmieren - alles kontrollieren 4.934 Themen, 20.613 Beiträge

Assembler: Wie DS:DX eine Speicheradresse zuweisen?

Mdl / 6 Antworten / Flachansicht 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
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