Adresse in SI kopieren?
-
Hi Leute!
Ich hab eine Frage zu meinem folgenden Code:
ASSUME CS:CODE, DS:DATA, SS:STAPEL ;------------------------------------------ ; Definition von Konstanten ANZAHL EQU 2000d ;------------------------------------------ DATA SEGMENT var DB ANZAHL DUP ('?') DATA ENDS ;------------------------------------------ STAPEL SEGMENT STACK 'STACK'; DB 1123H DUP ('X') STAPEL ENDS ;------------------------------------------ CODE SEGMENT START: MOV AX, DATA MOV SI,var CODE ENDS END START
Ich möchte nun die Startadresse der Variablen var die ich im Datensegment definiert habe in mein SI Register laden. Nur wie gehe ich dazu vor? Ich habs schon mal so ausprobiert wie ich es oben geschrieben habe. Nur leider funzts so nicht. Könnt ihr mir helfen wie man das macht? Ich mein im Debugger in den Speicher schaun und selbst herausfinden wo diese Variable var im Datensegemtn beginnt kann's ja wohl nicht sein, oder?
Danke für eure Hilfe!
-
Was ich mittlerweile zustätzlich noch probiert habe, ist, dass ich den Offsetwert laden könnte. Das sieht dann so aus:
ASSUME CS:CODE, DS:DATA, SS:STAPEL ;------------------------------------------ ; Definition von Konstanten ANZAHL EQU 2000d ;------------------------------------------ DATA SEGMENT var DB ANZAHL DUP ('?') DATA ENDS ;------------------------------------------ STAPEL SEGMENT STACK 'STACK'; DB 1123H DUP ('X') STAPEL ENDS ;------------------------------------------ CODE SEGMENT START: MOV AX, DATA MOV SI,offset var CODE ENDS END START
Leider funktioniert das dann aber auch nicht so wie ich mir das vorstelle... In meinem Buch steht aber genau das drin, dass mit diesem Befehl der Offsetwert der Adresse der Variablen die im Datensegment deklariert wurde in das jeweilige Register geladen werden würde, was es aber nicht tut...
-
Zumindest fuer TASM und MASM hat dein Buch recht: Genau so funktioniert das.
Damit hast du das Offset (den 2. Teil der Adresse von var) in si.
Da beim x86 eine Adresse aber aus 2 Teilen besteht, musst du zum Adressieren auch noch den ersten Teil (das Segment) hinzuziehen. In AX nuetzt dir die Segmentadresse allerdings nicht viel. idR. kopiert man die von einem Standard-Register gleich weiter. Hier wuerde sich das Segmentregister DS anbieten...
-
Und wie bekomm ich nun die Adresse des Datensegements da hin?
-
Mit deiner Hilfe hab ich nun mein Problem gelöst. Hab aber schon eine weitere Frage. Mit dem Code unten will ich die jeweiligen Offsetadressen von zwei Variablen var1, var2 nach SI bzw. DI laden. var1 beginnt bei 100h und var2 beginnt bei D80h. Das hab ich mir vorher im Debugger angesehen. Wenn ich nun den Code aber ausführe, dann steht in SI 0h und in DI 7D0h; komischerweise um genau die 100h verschoben... Was ist da jetzt noch falsch?
MOV AX,Data MOV ES,AX LEA SI,var1 LEA DI,var2 MOV CX,2000d CLD loop2: MOVSB loop loop2
-
Der Befehl movsb kopiert standardmäßig ein Byte aus DS:SI nach ES:DI. Ist das richtig verstanden worden?
Mal angenommen, wie arbeiten innerhalb eines Segmentes, also CS=DS=ES=SS usw. und der Code fängt bei Adresse 100H an bzw. der Instruction Pointer zeigt auf 100h und der Stack Pointer zeigt irgendwo auf das hintere Ende unseres Segmentes...
Jetzt möchte ich die Variable1 in den Speicher schreiben, und dann nach Variable2 kopieren. So könntest du die Variable1 nach Speicheradresse 200h schreiben, und die Variable2 nach Speicheradresse 300h. Nun muss man nur noch die richtigen Adressen für Si und Di eintragen: mov si, 200H und mov di, 300H. Bei 2000 Wiederholungen (2000:16 = 125 R 0, 125:16 = 7 Rest D), also 7D0H Wiederholungen) wird es aber etwas eng...;)