MONTAGE: Könnte mir jemand erklären, was diese Zeile mit dem leaq Anweisung tut?
Ich bin durch einige Assembler-code, und ich kann nicht herausfinden, was eine code-Zeile macht. Der code ist:
leaq 0(,%rax,4), %rdx
Ich weiß lea
ist im Grunde eine Art von mov
Anleitung, aber es bewegt immer nur die Adresse. So bewegen wir die Adresse etwas zu %rdx
(machen %rdx
"Punkt", um etwas auf dem stack). Ich weiß, was %rax
Punkte auf den Stapel (sagen -28(%rbp)
), aber ich bin verwirrt, wie das multiplizieren mit 4, um meine Antwort. Würde %rdx
Punkt zu 4*(-28) = -112(%rbp)
?
Dank!
BEARBEITEN:
Für den Zusammenhang, den folgenden code vor dieser Anweisung:
pushq %rbp
movq %rsp, %rbp
movl %esi, -28(%rbp)
movl -28(%rbp), %eax
cltq
leaq 0(,%rax,4), %rdx
- irgendwann
lea
ist auch für Berechnungen verwendet. schwer zu sagen, in Ihrem Fall, da Sie nicht genügend code, um zu sehen. - Auch die 0 auf der Außenseite scheint überflüssig, da es nur noch hinzufügen, nichts zu der Adresse. Es sei denn, Sie benötigen es, um indirekt Zugriff auf den Speicher.
- Ich habe eine Zusammenfassung von dem code, der vor dem Unterricht. Hoffe, das ist genug @emschorsch ich bin einverstanden; ich denke, die
0
ist sinnlos zu; es muss der vom compiler erzeugt wird - Wie Sie sehen können, was in
%esi
wird auf den stack kopiert und dann kopiert, um%eax
. Neben%eax
ist erweitert um 64bitrax
von der Maschine Befehlcltq
. Am Ende derleaq
Befehl multiplizieren%rax
durch 4 und speichern Sie es in%rdx
. Um sicher zu sein für das, was die Hölle ist es getan, wir müssen sehen, was passieren wird%rdx
später. - Mögliche Duplikate von Was ist der Zweck der LEA-Anweisung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre entsprechende C-code ist so etwas wie:
n übergeben wird, als ein einzelnes 32-bit-register esi, gespeichert auf lokalen stack-frame.
Der parameter wird anschließend verwendet, in der Auswertung werden die 64-bit-Ausdruck 4*ein. Die '0' erklärt werden kann, wenn es sein soll, verlegt durch die linker an die Adresse 'arr'.
Dann meine Vermutung ist, dass der Assembler-code wird nicht generiert
gcc -S foo.c
, aber durchgcc -c foo.c; objdump -d foo.o
Ich glaube der code ist in Bewegung, was ist an der Adresse in
%rbp-28
in%eax
. Dies wird wahrscheinlich eine ganze Zahl sein. Dann ist es einfach nur verschoben, dass dievalue*4
in%rdx
(Die 64-bit-version von%eax
ähnlich wie%ah
ist das high order Byte%eax
). Diese Frage scheint zu diskutieren, die ein ähnliches Problem.