Baugruppenbefehle LEA / LDS / LES [duplizieren]

8

Was ist der Unterschied zwischen den folgenden Befehlen: LEA , LDS , LES ? Ich suchte nach der Antwort, aber ich bin nicht sehr klar darin. Soweit ich das verstanden habe, sollte block1 gleich block2 sein.

%Vor%

... aber wenn ich str1 und str1 unter Verwendung des folgenden Makros drucke, gibt der zweite Block nicht die erwarteten Ergebnisse zurück.

%Vor%     
Roxana Ciobanu 06.12.2013, 22:01
quelle

1 Antwort

11

lea bedeutet Effektive Adresse laden . So setzt lea SI, str1 si auf den Offset von str1 . Die korrekte Speicheradressierungssyntax, die von lea und anderen Anweisungen verwendet wird, hängt vom verwendeten Assembler ab, einige Assembler wollen lea si,[str1] .

lds und les machen etwas völlig anderes als lea . lds bedeutet Load Zeiger mit DS und ebenso les bedeutet Load Zeiger mit ES . In der Praxis setzt lds SI, ptr_str1 ds und si basierend auf den Werten, die in der Speicheradresse ds:ptr_str1 gespeichert sind (die Syntax ist [ds:ptr_str1] in einigen Assemblern).

Was diese Anweisungen in Ihrem Code tun:

  1. lea SI, str1 setzt si auf die Adresse von str1 . Das scheint vollkommen in Ordnung zu sein.

  2. lds SI, ptr_str1 setzt si auf 'My' (0x794d in Hexadezimal) und setzt ds auf ' f' (0x6620 in Hexadezimal). Beachten Sie, dass x86 eine Little-Endian-Architektur ist. ds ist das Standardsegment, von dem der Zeigerwert mit lds und les gelesen wird. Anstatt also die String-Adresse auf ds:si zu laden, werden die ersten 4 Bytes der Zeichenfolge als eine Adresse verwendet, die in ds:si geladen wird. Ich nehme an, das ist nicht das, was Sie tun wollten.

  3. les DI, ptr_str2 setzt di entsprechend dem in 0x6620 gespeicherten Wert: ptr_str2 ( ds ist das Standardsegment für die meisten x86-Anweisungen und aktuell ds hat den Wert 0x6620) und setzt auch es gemäß dem in 0x6620 gespeicherten Wert: ptr_str2 + 2. Wahrscheinlich wollten Sie das nicht tun.

nrz 06.12.2013, 23:23
quelle

Tags und Links