2016-06-10 17 views
0

Gibt es eine Möglichkeit lea auf einem Array von Zeigern zu verwenden?Load effektive Adresse einer Zeichenfolge in einem Array von Zeichenfolgen?

Zum Beispiel haben wir eine Reihe von Zeichenfolgen, ist es möglich, eine einzige Zeile mit lea anstelle der beiden mit + markierten Zeilen zu tun?

.data 
ARR DWORD STR1, STR2 ... 
STR1 byte "asdad", 0 
... 
.code 
;;;lea edx, [ARR+4*eax] 
mov edx, offset ARR ;+ 
mov edx, [edx+4*eax] ;+ 
call writestring 

Der Kommentar gesetzt lea nicht und alles andere, was ich versuchen bestanden hat nicht funktioniert auch Montage.

+0

Try 'LEA ARR [edx + 4 * EAX]. Es sollte "REG + SCALE * REG + disp32" sein. – zx485

+0

@ zx485 es funktioniert nicht. Sogar mit 'mov edx, offset ARR' vor' LEA ARR [edx + 4 * eax] '. – shinzou

Antwort

4

Sie möchten LEA nicht wirklich verwenden, da es eine Adresse berechnet, wo die Daten in dieser Adresse enthalten sein sollen.

Wenn Sie LEA verwendet haben, erhalten Sie die Adresse für die Position im Array. Sie können das nicht beim Schreiben der Zeichenfolge verwenden. Im Vergleich zu C wäre dies beispielsweise die char**, während Sie char* möchten.

Wenn Sie die Zeichenfolge schreiben möchten, müssen Sie genau das tun, was Sie tun. Sie lesen tatsächlich den Zeiger im Array.

Kurz gesagt, LEA ist nicht was Sie wollen, Sie wollen die MOV s Sie bereits verwenden. Sie können es zu verkürzen, der Lage sein, eine MOV:

mov edx, ARR[4*eax] 

oder mit nasm

mov edx, [4*eax + ARR] 
+0

Das hat funktioniert, warum brauchen wir nicht den "Offset"? – shinzou

+1

'offset' bedeutet Adresse des Symbols. Also ist '[offset ARR]' im Prinzip gleich kürzer '[ARR]', während 'offset [ARR]' nicht viel Sinn macht - das ist eine Art was 'lea' tut, aber es nennt es nicht offset Das "ea" in "lea" bedeutet "effektive Adresse". "offset" wird normalerweise verwendet, wenn eine Mehrdeutigkeit auftreten kann, wie einige Assembler "mov eax, ARR" als Laden von eax mit ARR-Adresse und einige als Laden von eax mit Wert bei ARR-Adresse behandeln. Ich vermeide diese Syntax vollständig und verwende entweder 'mov eax, offset ARR' oder' mov eax, [ARR] 'abhängig davon, was ich laden möchte. – Ped7g

Verwandte Themen