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.
... aber wenn ich str1
und str1
unter Verwendung des folgenden Makros drucke, gibt der zweite Block nicht die erwarteten Ergebnisse zurück.
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:
lea SI, str1
setzt si
auf die Adresse von str1
. Das scheint vollkommen in Ordnung zu sein.
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.
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.