2016-08-05 7 views
3

Warum verursacht lea esi, dword [edx + ecx * 4] einen Fehler beim Zusammenbau mit NASM?Warum erzeugt `lea esi, dword [edx + ecx * 4]` einen Fehler, wenn sie mit NASM zusammengebaut werden?

ich den Fehler:

insertion_sort.asm:19: error: mismatch in operand sizes

Allerdings ist der Zweck der lea nur die Adresse dword [edx + ecx * 4] zu laden, so dass auch dadurch die Referenz ist es für einen DWORD-Wert sollte keine Rolle spielen?

Auf der anderen Seite,

mov eax, dword [edi] 

arbeitet als völlig in Ordnung zu erwarten. Hier deklariere ich, dass [edi] einen DWORD-Wert referenziert.

Antwort

3

Im Fall lea ist der Größenspezifizierer nicht relevant. Sie laden nichts aus dem Speicher - Sie berechnen nur eine Adresse (muss nicht einmal etwas sein, das Sie als Adresse verwenden möchten - Sie können lea für allgemeine Arithmetik verwenden). Es würde keinen Unterschied zwischen lea esi, byte [edx] und lea esi, dword [edx] geben, so dass es keinen Sinn hat, einen Größenbezeichner zu haben.

Es ist tatsächlich redundant in Ihrem mov Beispiel, weil die Größe aus dem Zieloperanden abgeleitet werden kann. Aber im Fall von mov ist es tatsächlich in einigen Fällen relevant (z. B. mov byte [edi], 1), wohingegen dies im Fall von lea nicht der Fall ist.

Beachten Sie, dass können haben lea eine Adresse 16-Bit berechnen und Null erweitern sie in ein 32-Bit-Zielregister (oder eine Adresse 32-Bit berechnen und in ein Zielregister 16-Bit gestutzt). Aber die Adressgröße ist nach Intels Handbuch bestimmt durch "das Attribut des Codesegments", anstatt etwas, das Sie in der Anweisung angeben.

+0

Also, der Fehler von NASM produziert ist, weil "es keinen Sinn hat eine Größenangabe überhaupt"? Sollte NASM den Spezifizierer dann nicht ignorieren und keinen Fehler erzeugen? – Shuzheng

+1

Jemand mit besserem Wissen über den NASM-Quellcode müsste das beantworten. Ich könnte sicherlich eine Gefahr darin sehen, unerwartete Token stillschweigend zu ignorieren, da die Erwartung des Programmierers, was der Assembler produziert hat, von der Realität abweichen könnte. Ich stimme zu, dass die Fehlermeldung ein wenig kryptisch erscheint. – Michael

+0

Danke @Michael. – Shuzheng

0

Nachdem ich ein bisschen damit herumgespielt habe, glaube ich, dass das dword Präfix ist, was nasm auftaucht. Lass es einfach und nasm ist glücklich.

Verwandte Themen