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.


Anmelden zum Antworten