Wert an Speicheradresse ändern
-
Hallo zusammen!
Ich habe folgendes Problem:
Ich würde gerne den Wert an einer Speicheradresse lesen und anschließend ändern.
Z.B. will ich den Wert an der Adresse 455455 auslesen und den Wert anschließend auf z.b. 5 ändern.Gruß,
Xel
-
den Wert von der Speicheradresse in die variable addy zu speichern geht:
mov addy,[404FF0h]
Nur wenn ich nun den Wert z.b. an die Stelle 1000h schreiben will mittels:
mov byte ptr [1000h],addy
bekomme ich den Fehler "Ungültiger Operandentyp" (Ich füge asm Code in ein C++ Programm ein unter Visual C++).
Wo liegt der Fehler bei der ganzen Sache ?
Gruß,
Xelvius
-
"mov" kann auf x86 CPU keine 2 Speicherzugriffe als Operanden haben. Insofern verwunderlich, dass der VS-Compiler die 1. Zeile schluckt... Was auch immer er dann daraus macht...
Du kannst vom Speicher nur in ein Register lesen.
zB. mov al, [404FF0h]
Ansonsten kannst du ausser Register auch Konstanten in den Speicher schieben. Was anderes geht nicht.
also zB. mov [1000h], al
-
[404FF0h] ist kein Speicheroperand
-
Ich hatte mal auf folgender Seite geschaut, und dachte das es funktionieren kann. Seht ihr da ne Möglichkeit das es funktioniert?
-
Deine zweite Variante ergibt leider auch einen Fehler Nobuo.
-
He, he, so viel zu Intel-Syntax ist benutzerfreundlicher als AT&T...
-
Na, das liegt einzig daran, was der MASM daraus macht. Sei lieber froh, dass MS sich bisher noch nicht die AT&T-Syntax derart vorgenommen hat.
@Xelvius:
Sry. Bevor ich dann noch mehr Muell erzaehle, warte ich lieber darauf, dass camper es richtet. Er scheint sich ja mit den Syntaxeigenheiten scheinbar besser auszukennen.
-
Laut dem von dir verlinkten Artikel funktioniert MOV WORD PTR 1000h,AX mit TASM. Allerdings kann das durchaus an der Version liegen (v2 meckert bei dieser Schreibweise). Welche TASM-Version nutzt du denn? Generell würde ich aber von TASM abraten. Nimm besser FASM oder NASM.
Leider nutzen viele (ältere) Tutorials/Lehrbücher TASM für ihre Beispielprogramme. Aber wenn du dich mit einem anderen Assembler vertraut gemacht hast, kannst du die Programme problemlos für deinen Assembler umschreiben.
-
Über Syntaxeigenheiten philosophiere ich hier lieber nicht. Diese Diskussion wird ohnehin nur selten sachlich geführt.
Bei Intel-Syntax (das ist keine Erfindung von Microsoft) ist 100h eine Konstante, und [100h] ebenso.
Ein Speicherbezug entsteht dann, wenn eine Variable (so etwas kennt NASM bekanntlich nicht...) oder ein Register involviert ist, das kann zur Not auch ein Segmentoverride sein. Also z.B.mov addy,ds:[404FF0h] mov byte ptr ds:[1000h],addy
Der Assembler ist hier schlau genug, den Override nicht tatsächlich zu generieren. Es müsste eigentlich noch einen Operator dafür geben (der 8008/8080/8085 und Kompatible haben ja keine Segmentregister), aber ich kann mich nicht mehr erinnern, wie das funktionierte.
-
Also gibt es da keine bekannte Möglichkeit den Wert an einer Speicheradresse zu überschreiben?...sollte doch nicht so schwer sein...aber naja für mich ist es das anscheinend
-
Also gibt es da keine bekannte Möglichkeit den Wert an einer Speicheradresse zu überschreiben?
Wie meinst du denn das mit der bekannten Möglichkeit? Es steht dir frei, an beliebigen Adressen rumzuschreiben - ob es Sinn macht und ob es "erlaubt" ist, sei dahingestellt.
Was mich wundert, dass der Beispiel-Code von camper angeblich funktionieren soll. Denn da versucht man ja anscheinend, mit einem mov-Befehl von einer Adresse direkt auf die andere zu schreiben. Das ist wahrscheinlich mit dem MASM Assembler möglich, warum auch immer...
-
abc.w schrieb:
Was mich wundert, dass der Beispiel-Code von camper angeblich funktionieren soll.
Das steht dort nicht. Eben weil dort mit der Korrektur tatsächlich 2 Speicheroperanden (es sei denn, addy ist ein Textmakro, das zu einer Registerbezeichnung expandiert) beteiligt sind, wird der Assembler sich daran stören. Im ursprünglichen Fall war das ja anders, dort ist im zweiten Befehl der erste Operand eine Konstante (immediate), was natürlich ebenfalls, aber aus anderen Gründen, unmöglich ist.