wake-up-neo.com

Grundlegendes zum% rip-Register in Intel Assembly

In Bezug auf den folgenden kleinen Code, der in einem anderen Beitrag über die Größe der Struktur und alle Möglichkeiten zum korrekten Ausrichten von Daten veranschaulicht wurde:

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));
}

Ich bekomme die entsprechende Demontage (mit 64 Bit)

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 ich die Begriffe auf der rechten Seite berechnen soll, bei denen es sich anscheinend um den verwendeten address of local variables Handelt. Außerdem kann ich es nicht mit %rip register Berechnen.

Könnten Sie ein Beispiel geben, das die Verknüpfung zwischen %rip Und %rsp Oder %rbp Zeigt, d. H. Insbesondere bei der Berechnung der Adresse, wenn ich move -Anweisungen verwende.

8
youpilat13

Die RIP-Adressierung bezieht sich immer auf das RIP-Register (64-Bit Instruction Pointer). Daher kann es nur für globale Variablen verwendet werden. Der 0-Offset entspricht der Adresse des folgenden Befehls nach dem RIP-adressierten Befehl. Beispielsweise:

   mov  al,[rip+2]                     al=53
   jmp  short next   (length=2 bytes)   
db 53
next:
   mov  bl,[rip-7]   (length=6 bytes)  bl=53

Normalerweise würden Sie Daten nicht direkt in Ihren Code mischen, außer als Sofort-Code. Dies zeigt jedoch, was passieren würde, wenn Sie Code mit sehr kleinen Offsets ausführen würden.

In Ihrem Code können Sie keine Offsets sehen und überprüfen (Sie sehen vier Nullen), da Sie einen .o Zerlegt haben. Verwenden Sie objdump -drwC, Um beim Zerlegen die Symbolnamen/-verlagerungen anzuzeigen. Sie werden vom Linker gefüllt, wenn Sie dieses Objekt in eine ausführbare Datei verlinken.


Beispiel für den Zugriff auf Einheimische relativ zu `rbp:

Push rbp      ;save rbp
mov rbp,rsp   ;rbp = pointer to return address (8 bytes)
sub rsp,64    ;reserve 64 bytes for local variables
mov rax,[rbp+8];  rax = the last stack-passed qword parameter (if any)
mov rdx,[rbp];    rdx = return address
mov rcx,[rbp-8];  rcx = first qword local variable (this is undefined now)
mov r8, [rbp-16];  r8  = second qword local variable (this is undefined now)
.
.
mov rsp,rbp
pop rbp
ret
5
toncsi