![]() |
Assembler in C++
Ich muss für die Schule ein "Chat-Programm" schreiben. Die "Daten" werden über die Serielle Schnittstelle transportiert.
Mein Problem: Ich möchte dem Benutzer Eingabe der I/O-Adresse ersparen. Das heißt, ich will mittels Assembler von der Adresse 0040:0000 das Word lesen, da steht die I/O-Adresse ja drin. Mein Vorschlag wäre: asm{ mov ax,40 mov ds,ax mov bx,0 mov cx,[bx] mov io,cx } io ist eine bereits initialisierte Integervariable. Mit der will ich dann weiter arbeiten. Die Zeile mov ds,ax macht Probleme; da hängt sich das ganze so ziemlich auf. Wisst ihr woran das liegt? Wenn ich das Datensegment (ds) durch das Extrasegment (es) ersetze, stürtzt er zumindest nicht ab (funktionieren tuts natürlich nicht...) Danke schon im Voraus |
Zugriff auf Adresse fehlerhaft
fehlerhafter Speicherzugriff:
mov ax,40 mov ds,ax mov bx,0 mov cx,[bx] Ich weiß leider nicht mehr genau, welche Segment-Register wie addiert werden. DS + BX ES ist für Stack zuständig. |
1. wieso eigentlich die serielle schnittstelle. verbindest du 2pc's über die seriell??
2. wieso echter assemblercode, ist natürlich super, aber mit c kannst ja auch direkt auf ports zugreifen, oder seh ich das falsch. |
Ihr seht das leider falsch...
Danke schon einmal, dass ihr auf den Beitrag geantwortet habt!
Allerdings möchte ich mit dem kurzen Beispiel auf 0040:0000 zugreifen (im Arbeitsspeicher). Dort steht die I/O-Adresse der Seriellen Schnittstelle. Über diese kann ich dann bequem per C/C++ (inportb; outportb) zugreifen. Probiert mal in einer Eingabeaufforderung oder einem echten DOS debug -d 0040:0000 einzugeben. Da seht ihr , dass dort: F8 03 F8 02... steht. Das sind die I/O-Adressen der Seriellen Schnittstellen (03F8) Wenn auf ds die Segment-Adresse steht, dann kann ich per [bx] (ja, das ist ein Zeiger - Offset) direkt von ds:bx (0040:0000) einlesen. Wenn ich das direkt mit debug mache (eine COM-Datei schreiben), dann funktionierts einwandfrei...(das Extrasegment hab ich nur genommen, weil ich wissen wollte, ob man überhaupt auf solche Segmente zugreifen kann) |
@detonation997 unter welchem os schreibst das?
|
OS
DOS-basierende Betriebssysteme.
Ich hab das Programm schon in MS-DOS, DR-DOS, Windows 98 und Windows XP ausprobiert. Überall der gleiche Fehler. Muss sich also um einen Programmierfehler handeln... |
Windows XP
Ok, Windows XP basiert nicht auf DOS (wäre halt gern ein Unix)
|
alle Register gesichert?
In deinem Programm-Code fehlt noch, daß du vor der Verwendung aller Register diese über PUSH sichern und anschließend über POP wiederherstellen solltest. Sonst kann das restliche Programm (in welcher Programmiersprache ?) 'durcheinander' kommen.
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 21:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag