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, 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

Schreibe einen Kommentar