Verständnis %rip register in intel-Montage
Bezüglich der folgenden kleinen code, der dargestellt wurde, in einem anderen Beitrag über die Größe des Bauwerks und alle Möglichkeiten zu richten Daten richtig :
struct
{
char Data1;
short Data2;
int Data3;
char Data4;
} x;
unsigned fun ( void )
{
x.Data1=1;
x.Data2=2;
x.Data3=3;
x.Data4=4;
return(sizeof(x));
}
Bekomme ich die entsprechenden Demontage (64 bits)
0000000000000000 <fun>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: c6 05 00 00 00 00 01 movb $0x1,0x0(%rip) # b <fun+0xb>
b: 66 c7 05 00 00 00 00 movw $0x2,0x0(%rip) # 14 <fun+0x14>
12: 02 00
14: c7 05 00 00 00 00 03 movl $0x3,0x0(%rip) # 1e <fun+0x1e>
1b: 00 00 00
1e: c6 05 00 00 00 00 04 movb $0x4,0x0(%rip) # 25 <fun+0x25>
25: b8 0c 00 00 00 mov $0xc,%eax
2a: 5d pop %rbp
2b: c3 retq
Ich weiß nicht, wie zu berechnen, die Bestimmungen, die sich auf der rechten Seite, scheint die address of local variables
verwendet. Außerdem, ich weiß nicht, zu berechnen, es mit %rip register
Könnten Sie ein Beispiel geben, das zeigt die Verbindung zwischen %rip
und %rsp
oder %rbp
ich.e vor allem in der Berechnung der Adresse verwenden, wenn ich move
Anweisungen.
Gibt es keine solche Beziehung,
Nein, es erhöht jedoch viele bytes der Anweisung ist. Er zeigt auf die nächste Anweisung.
Warum nicht Sie bitten, in dieser Frage? Vergleichen Sie das Objekt der Demontage mit der verbundenen Demontage, um zu sehen, was passiert. Der linker füllten den rest der Anweisung ist die Adresse/offset zu rippen. Ich zeigte den -m32 vs -m64-Anweisungen generiert wird, dann, wenn diese nicht komplett erzählen die Geschichte der verlinkten version hast.
es ist
rip
ist der instruction-pointer (daher der name). Sie können nicht auf den einheimischen gegenüber. Beachten Sie, dass x
ist nicht eine lokale. Beachten Sie auch, dass Sie verwendet objdump auf der mittleren Objekt-Datei, damit Sie Sie nicht die richtigen offsets. Möchten Sie vielleicht, um Sie auf eine verknüpfte ausführbare Datei und/oder die Nutzung -r
option, um zu sehen, relocation-Einträge.Nein, es erhöht jedoch viele bytes der Anweisung ist. Er zeigt auf die nächste Anweisung.
Warum nicht Sie bitten, in dieser Frage? Vergleichen Sie das Objekt der Demontage mit der verbundenen Demontage, um zu sehen, was passiert. Der linker füllten den rest der Anweisung ist die Adresse/offset zu rippen. Ich zeigte den -m32 vs -m64-Anweisungen generiert wird, dann, wenn diese nicht komplett erzählen die Geschichte der verlinkten version hast.
es ist
RIP
, nicht RPI
. ("instruction pointer" nicht "instruction pointer"). Auch in 32b-Modus die 32b Variante eip
verwendet wird, und in 16b Modus 16b ip
Teil. rip
hat keine 8-bit-Aliase (wie rax
hat al
).movb $0x4,0x0
speichert byte-Wert 4
in Erinnerung an die absolute Adresse 0
. movb $0x4,0x0(%rip)
speichert byte-Wert 4
in Erinnerung an die absolute Adresse rip + 0
, dh. bei relative-to-RIP-Adresse 0
. Es ist dasselbe wie die Verwendung anderer Register für die Adressierung, wie movb $4,0(%edi)
. Der Unterschied ist, dass die rip
Punkte zum Zeitpunkt der evaluation an den Anfang der nächsten Anweisung. Also die Verwendung von rip
für die relative Adressierung ermöglicht es dem compiler zu produzieren "PIC" Position Independent Code. Das OS muss dann zum laden der Daten + code zusammen und behalten Ihre relative position zueinander.InformationsquelleAutor youpilat13 | 2017-02-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
RIP-Adressierung ist immer relativ zu RIPPEN (64-bit Instruction Pointer) register. So kann es sein, verwenden Sie Globale Variablen nur. Die 0-offset ist gleich der Adresse der folgenden Instruktion nach dem RIP-Unterricht angesprochen. Zum Beispiel:
Würden Sie normalerweise nicht mischen Daten mit Ihrem code außer als unmittelbare, aber das zeigt, was passieren würde, wenn Sie tatsächlich lief-code mit sehr kleinen offsets.
In Ihrem code, den Sie nicht sehen können, und überprüfen Sie die offsets (sehen Sie vier Nullen) ein, weil Sie zerlegt ein
.o
. Verwendenobjdump -drwC
zu zeigen, symbol-Namen /Umzüge bei der Demontage. Sie wird gefüllt, indem der linker beim verknüpfen Sie dieses Objekt in eine ausführbare Datei.Beispiel für den Zugriff auf die einheimischen relativ zu `rbp:
.o
eher als eine verknüpfte ausführbare Datei. Position-independent code muss nicht Laufzeit-Korrekturen jedes mal, wenn es geladen ist; dies ist einer der großen Vorteile der RIP-relative Adressierung.InformationsquelleAutor toncsi