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 mitmov 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 stattmov 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.