Das von Ihnen verwendete Befehlsformat ist "illegal". Der Prozessor versteht den Wechsel zwischen zwei Speicherorten nicht. Deshalb erhalten Sie einen Fehler. Durch Verwendung des direkten Adressierungsmodus des Registers (unter Verwendung der eckigen Klammern) geben Sie ihm Speicheradressen, die in jedem der aufgelisteten Register (edi, esi) gespeichert sind.
Der Prozessor kann das einfach nicht. Es tut mir Leid. Sie müssen einen anderen Weg finden, um das zu tun, was Sie tun wollen.
Jetzt bewegt sich die Anweisung movsb um ein Byte von der Adresse, auf die esi zeigt, in die Adresse, auf die edi zeigt. Das mag sein, was Sie versuchen zu finden, aber in diesem Fall ist der Code einfach
ohne Parameter. Es wird auch esi und edi inkrementieren oder dekrementieren, abhängig von dem Wert des Richtungsflags (das normalerweise klar ist, so dass es inkrementieren würde).
Sie können den Wiederholungsmodifizierer verwenden, um die Anweisung so oft zu wiederholen, wie durch den in ecx gespeicherten Wert angezeigt wird.
Denken Sie daran, dass die Werte IN edi und esi durch die Anweisung movsb geändert werden. Wenn Sie movsB verwenden, werden sie um eins erhöht oder verringert.
Wenn Sie zwei Werte im Speicher austauschen müssen, können Sie es mit einem zusätzlichen Register tun, wie von einem anderen Benutzer als Antwort auf meine etwas weniger effiziente Methode mit zwei Registern wiesen darauf hin:
mov edx, [edi]
xchg edx, [esi]
mov [edi], edx
Dies tauscht die Inhalte der Speicheradressen, auf die der Inhalt von edi
und esi
zeigt. Es gibt keinen kürzeren Weg, es zu tun.
In der Regel keine. Aber in diesem speziellen Fall können Sie die 'movsb'-Anweisung verwenden. Siehe Band 2 der Intel-Handbücher. – Michael
@Michael Ich versuche es, aber es schlägt wieder fehl. Verwendet das NASM, um es zu kompilieren? – Liberty
_ "es scheitert" _ ist keine ausreichende Problembeschreibung. Was ist die _exact_ Fehlermeldung, die Sie erhalten, und was ist die _exact_ Codezeile, der der Fehler entspricht? – Michael