Zwei kleine Fragen zur Segmentadressierung



  • Hi,
    ich habe mal das folgende, relativ simple Programm geschrieben:

    data segment
     source db "Der Quellstring.","$"
     Laenge equ $ - source
    data ends
    
    destination segment
    dest db 20 dup(?)
    destination ends
    
    code segment
    assume ds:data,cs:code,es:destination	; 1.?
    
    start:
    mov cx,Laenge
    
    mov ax,data	;1a
    mov ds,ax
    
    lea si,source
    lea di,dest
    
    rep movsb
    
    push ds	
    
    mov ax,es		;2.?
    mov ds,ax	
    lea dx,dest
    mov ah,9h
    int 21h
    
    pop ds
    
    mov ah,1	;dummy-Input
    int 21h		;damit Programm nicht sofort beendet
    
    mov ah,4ch
    int 21h
    
    code ends
    end start
    

    Dazu habe ich zwei Fragen, die ich schon als Kommentare gekennzeichnet habe.
    Ad 1.) Imo legt doch die Assume-Anweisung die defaults für die angegebenen Segment-Register fest, oder? Also hat z.B. das ds-Register bereits zu Beginn des Programms die Base-Adresse vom Data-Segment. Dennoch muß ich bei 1a) ds nochmal neu initialisieren, damit die folgenden Anweisungen nicht in undefinierten Speicherbereich reinhauen. Warum?

    Ad 2.) Nachdem der Quellstring aus dem Data-Segment ins Destination-Segment kopiert wurde, möchte ich ihn aus diesem Segment auch ausgeben. Da das Destination-Segment im es-Register steht, habe ich keine andere Alternative gefunden, als ds zu pushen, um dann es in ds zu kopieren. Gibt es da keine schönere Methode? 9h von int 21h verlangt doch, dass das Segment im ds und das Offset in dx steckt. Geht das also nur so, wie oben geschrieben?

    Gruß
    E-the-Real



  • Hi.

    Zu 1:
    Nein, Assume legt lediglich fest, wie effektive Adressen zu Labels bei Benutzung eines bestimmten Segmentregisters berechnet werden.
    Die Segmentregister musst du dennoch "manuell" setzen.
    ES muesste also bei Programmstart auch nicht auf "destination", sondern aufs PSP zeigen.

    Zu 2:
    Tja, mir faellt nun zumindest nichts besonders effektives ein, aber es waere zB. schonmal schneller, nicht es nach ds zu kopieren, sondern eine fixe Zahl in ax zu laden (also so, wie auch ds zu Anfang des Programms initialisiert wurde).



  • zu 1) Okay, das heißt also, dass ich auch es noch auf das entsprechende Segment zeigen lassen muß. Also muß da dann noch ein

    mov ax,destination 
    mov es,ax
    

    rein, oder?
    Dennoch scheint es bei mir aber auch so zu funzen, zumindest wird der String in das richtige Segment an das richtige Offset kopiert. Wie ist das zu erklären?

    zu 2)
    Wie meinst du das? Soll da die Adresse von destination als Direktwert, also Hexadezimal, rein? Wie bekomme ich die denn dann raus?

    Dankeschön erstmal!



  • Okay, das heißt also, dass ich auch es noch auf das entsprechende Segment zeigen lassen muß. Also muß da dann noch ein

    mov ax,destination 
    mov es,ax
    

    rein, oder?

    Sollte funktionieren.
    Wenn nicht, versuchs mal mit

    mov ax, seg destination
    mov es, ax
    

    Dennoch scheint es bei mir aber auch so zu funzen, zumindest wird der String in das richtige Segment an das richtige Offset kopiert. Wie ist das zu erklären?

    Wie hast du das geprueft?
    Ansonsten sollte das zumindest unter WinNT etc. in der Tat problemlos funktionieren, da das Offset des Labels "dest" bei Adressierung ueber ES 0 sein sollte.
    So wird halt einfach ein bissel hier weitgehend nutzloser Krempel aus dem PSP mit deinem kurzen String ueberschrieben.
    Da es sich hierbei um einen systematischen Fehler handelt, faellt das dann auch nicht weiter auf.

    nochmal zu 2:
    ich meinte statt

    mov ax,es        ;2.?
    mov ds,ax
    

    besser

    mov ax, destination
    mov ds, ax
    


  • alright, danke dir!



  • Hallo ethereal,

    warum definierst Du eigentlich für den Ziel-Buffer ein eigenes Segment? Du kannst natürlich auch den Ziel-Buffer in dem selben Segment definieren, wie die Quelle(Segment data). Dann schreibst Du in ES auch die Segemntadresse von data, so dass DS=ES ist.

    Es sei denn, Du hast es nur zu Übungszwecken gemacht. Die Stringbefehle(movsb, movsw, etc) verlangen nicht zwei unterschiedliche Segmente. Quelle und Ziel können auch in dem selben Segment stehen.

    Ciao...



  • Ja, danke, aber es waren tatsächlich nur Übungszwecke. Trotdzem Thx.


Anmelden zum Antworten