Adresse oder Inhalt?
-
Hallo!
Ich beschäftige mich gerade mit der Intel Assembler-Programmierung, und ich habe hier ein Buch als Hilfe, das sich meiner Meinung nach aber ein wenig widerspricht:
mov ax, Zaehler ;Schiebt den Inhalt der Variablen Zaehler in das ax Register.
Jetzt verstehe ich nicht ganz, warum der "Inhalt" verschoben wird, und nicht die Speicheradresse, an dem sich der Inhalt befindet, denn:
String db "Wind", 0 ;was bedeuted die 0 hier? mov bx, offset String cmp [bx], "i" ; vergleicht den Inhalt der Speicherstelle mit dem Buchstaben i
(Die Semikolons in den Anführungszeichen gehören nicht dazu. Werden aber automatisch vom Forum gesetzt
)
In dem Beispiel sind die eckigen Klammern notwendig, um auf den Inhalt zuzugreifen, ebenso hier:mov ax, [102] ; Schiebt den Inhalt der Speicherstelle 102 in das ax Register
Danke für Antworten im voraus!
-
mov eax,foo
verschiebt den Inhalt von foo, also vergleichbar mit folgendem C++ Ausdruck
eax=foo;
lea eax,foo
lädt das Offset (die Adresse) von foo nach eas, also vergleichbar mit folgendem C++ Ausdruck
eax=&foo;
die Eckigen Klammern bedeuten bei der Intel-Syntax, die Dereferenzierung des Speichers.
lea eax,foo mov ebx,[eax]
vergleichbar mit folgendem C++ Ausdruck
eax=&foo; ebx=*eax;
das 0 dient der Nullterminierung, die von vielen Routinen gefordert wird, da die meisten Routinen C-Strings erwarten.
(hoffe ich habe nicht allzu viel blödsinn erzählt, ist länbger her, dass ich mit Assembler (besonders mit Intel Assembler) gearbeitet habe :))
-
du kannst auch:
mov ax,[zaehler]
schreiben... streng gesehen musst du das auch und TASM zB gibt auch eine warnung aus, falls du im IDEAL mode bist und die klammern nicht setzt.
aber normalerweise ist es nicht notwendig, der assembler macht daraus automatisch [zaehler] beim assemblieren.
wenn du die adresse der variablen meinst, dann musst du eben:
mov ax,offset zaehler
oder
lea ax,zaehler
benutzen.
wenn du aber sowas hast wie:
mov ax,[100]
dann kann der assembler nicht wissen, dass die 100 eine speicheradresse sein soll und deshalb ist die klammer notwendig, um dem assembler zu sagen, dass die 100 als adresse gemeint ist und nicht als einfache zahl.
wenn du hast:
mov ax,[bx]
dann ist hier die klammer auch unbeding notwendig, da der assembler wieder nicht wissen kann, dass bx hier als zeiger dient. falls du die klammer nicht setzt, dann wird einfach der inhalt von bx in das register ax kopiert, anstatt der inhalt der speicherstelle auf die bx zeigt.
-
TASM erzeugt aus
lea eax,variable
eine MOV Instruktion und kein echtes LEA.
-
wenn man den inhalt einer variable verwenden will, mus man bei mov doch immer [] verwenden. wenn man den offset der adresse haben will, darf man nicht [] verwenden. bei lea darf man [] nicht verwenden, wenn man den offset verwenden will... oder hab ich das falsch verstanden. jedenfalls ist mit oder ohne [] meiner meinung nach nicht gleichbedeutend.
-
assembler schrieb:
wenn man den inhalt einer variable verwenden will, mus man bei mov doch immer [] verwenden.
An sich schon. Alles andere ist IMHO misverstaendlich.
assembler schrieb:
wenn man den offset der adresse haben will, darf man nicht [] verwenden.
Mov-Instruktionen ohne eckige Klammern verschieben fixe Werte (das kann zB. das Offset einer Variable sein) oder Registerinhalte.
assembler schrieb:
bei lea darf man [] nicht verwenden, wenn man den offset verwenden will...
lea liefert das effektive Offset einer Speicheraddresse zurueck.
Demnach muessen fuer lea auch eckige Klammern verwendet werden.
Es handelt sich hierbei um die Berechnung einer Speicheraddresse, nur dass diese nicht verwendet wird, um tatsaechlich einen Wert vom Speicher auszulesen, sondern in den 1.Operanden der lea-Instruktion geschoben wird.
(AFAIK wird zur Berechnung auch die Addressiereinheit der CPU verwendet)
Bsp:lea ebx,[eax+2*eax+12345678h] mov eax,[ebx] ;ist das gleiche wie mov eax,[eax+2*eax+12345678h]
assembler schrieb:
oder hab ich das falsch verstanden. jedenfalls ist mit oder ohne [] meiner meinung nach nicht gleichbedeutend.
Noe, das auf keinen Fall, sonst waeren die eckigen Klammern leicht sinnlos
Wie oben schon geschrieben wurde:
Zugriff auf Speicher (oder bei Addressberechnung mit lea) => Eckige Klammern benutzen
Verschiebung von Fixwerten/Registern => keine eckigen Klammern