2010-03-28 11 views

Antwort

6

Die Zahl vor der Klammer ist ein Byte-Offset (wodurch eine Speicherreferenz verursacht wird), und Sie können nicht zwei davon mit movl haben. Sie müssen den Wert zunächst vorübergehend in ein Register verschieben.

movl 4(%ebp), %ecx 
movl %ecx, 8(%ebp) 
2

Es ist keine rechtliche Anweisung. Bei den meisten Befehlen, die auf den Speicher verweisen, müssen Sie sie in/aus einem Register verschieben.

2

movl nicht zu Speicher-Speicher bewegt, müssen Sie über ein Register gehen (also mit zwei movl Anweisungen).

+1

danke, aber warum? ist die CPU Architektur, die dies oder etwas anderes begrenzen? – freenight

+2

Ja, es ist eine Einschränkung in der CPU. MOVS ist der einzige Speicher-zu-Speicher-Befehl. –

+2

Yeah, Speicher-zu-Speicher kann nur nicht so effizient implementiert werden (Nicht-x86-CPUs neigen dazu, dass alle Anweisungen nur zur Registrierung registriert sind, mit Laden/Speichern als einzige Register-zu-Speicher). –