Assembler in DOS: Abstände im Speicher
-
Hallo,
ich versuche gerade einen Einstieg in die Assembler-Programmierung mit NASM. Für den Anfang will ich erstmal DOS-Programme im RM erzeugen. In meinem Programm erstelle ich eine Memory-List, dessen Werte addiert werden sollen. Für das untere Beispiel funktioniert es auch. Momentan ist der Speicherabstand der Liste auf 2d gesetzt, aber sobald ich den Speicherabstand in der Liste auf 1d stelle, funktioniert es nicht mehr. Was passiert dazwischen? Und gibt es einen guten DOS-Debugger, womit ich mir während dem Programmablauf alle Register und Speicherstellen anzeigen lassen kann? Das "debug" von DOS hat es jetzt nicht so gebracht.
org 256d create_mem_list: mov dx, 5d mov [500d], dx mov dx, 3d mov [500d + 2d], dx ; wenn ich Speicherstelle 501d anspreche, klappt es nicht mov dx, 2d mov [500d + 4d], dx mov dx, 0d mov bx, 500d list_addition: mov ax, [bx] add dx, ax add bx, 2d cmp bx, 500d + 6d jne list_addition cmp dx, 10d je yes jne close yes: mov dx, msg mov ah, 9 int 0x21 jmp close close: mov ah, 0x4c int 0x21 msg db 'Hello$'
-
ist jetzt nur eine vermutung, aber 16 bit rechner?
-
@Wade1234 Nein, 64bit-Rechner, aber das Programm wird in der DOSBox ausgeführt. Also hat es was damit zu tun, weil wenn ich ein 16bit-Register wie dx auf eine Speicherstelle verschiebe, sie 2 Speicherzellen (1 Speicherzelle = 8 bit) in Anspruch nimmt?
-
wie gesagt, das ist nur geraten. aber nach meinem wissen ist es allgemein schwierig, auf adressen zuzugreifen, die keine vielfachen der adressbreite (? keine ahnung, irgendwie so heißt das) sind.
dies verbunden mit der tatsache, dass dein 16-bit rechner (dosbox emuliert sowas ja) da probleme macht, ist halt schon "sehr verdächtig".
ich meine mich auch daran zu erinnern, dass man für sowas dann dl bzw. dh verwendet.
-
Mit dl oder dh habe ich es gerade probiert, weil die ja nur 8 bit lang sind und theoretisch nur eine Speicherzeile im Arbeitsspeicher belegen müssten. Da klappt es aber auch nicht.
-
nein du musst die adresse nach dx (mov [0x0815], dx) laden und dann kannst du mit dl auf 0x0814 und mit dh auf 0x0815 zugreifen.
edit: d.h. eigentlich umgekehrt, mit dh auf 0x0814 und mit dl auf 0x0815
-
@Wade1234 Ok, danke. Und kennst du auch einen guten DOS-Debugger, um alle Speicherzellen und Register während der Laufzeit eines Programms zu sehen?
-
um ehrlich zu sein nicht. wofür lernst du das überhaupt?
-
@Wade1234 Eher aus Spaß und Interesse
-
@oser sagte in Assembler in DOS: Abstände im Speicher:
Und gibt es einen guten DOS-Debugger, womit ich mir während dem Programmablauf alle Register und Speicherstellen anzeigen lassen kann?
Besorg Dir Borland C++ 3.1 ... ist inzwischen Abandonware und hat einen netten Debugger.