Comment utiliser RIP Adressage Relatif, dans la version 64 bits de l'assemblée programme?

Comment puis-je utiliser RIP Adressage Relatif, dans un Linux assemblée programme pour les AMD64 archtitecture?
Je suis à la recherche d'un exemple simple (un programme "Hello world") qui utilise AMD64 RIP relative de l'adressage mode.

Les suivantes, par exemple 64 bits assemblée programme serait de travailler avec la normale (adressage absolu):

.text
    .global _start

_start:
    mov $0xd, %rdx

    mov $msg, %rsi
    pushq $0x1
    pop %rax
    mov %rax, %rdi
    syscall

    xor %rdi, %rdi
    pushq $0x3c
    pop %rax
    syscall

.data
msg:
    .ascii    "Hello world!\n"

Je suppose que le même programme en utilisant RIP Adressage Relatif, ce serait quelque chose comme:

.text
    .global _start

_start:
    mov $0xd, %rdx

    mov msg(%rip), %rsi
    pushq $0x1
    pop %rax
    mov %rax, %rdi
    syscall

    xor %rdi, %rdi
    pushq $0x3c
    pop %rax
    syscall

msg:
    .ascii    "Hello world!\n"

La version normale fonctionne très bien lorsqu'il est compilé avec:

as -o hello.o hello.s && ld -s -o hello hello.o && ./hello

Mais je ne peux pas obtenir la version RIP de travail.

Des idées?

--- edit ----

Stephen la réponse de Canon fait le RIP de la version de travail.

Maintenant, quand j'ai démonter l'exécutable de la version RIP-je obtenir:

objdump -d bonjour

0000000000400078 <.text>:
  400078: 48 c7 c2 0d 00 00 00  mov    $0xd,%rdx
  40007f: 48 8d 35 10 00 00 00  lea    0x10(%rip),%rsi        # 0x400096
  400086: 6a 01                 pushq  $0x1
  400088: 58                    pop    %rax
  400089: 48 89 c7              mov    %rax,%rdi
  40008c: 0f 05                 syscall 
  40008e: 48 31 ff              xor    %rdi,%rdi
  400091: 6a 3c                 pushq  $0x3c
  400093: 58                    pop    %rax
  400094: 0f 05                 syscall 
  400096: 48                    rex.W
  400097: 65                    gs
  400098: 6c                    insb   (%dx),%es:(%rdi)
  400099: 6c                    insb   (%dx),%es:(%rdi)
  40009a: 6f                    outsl  %ds:(%rsi),(%dx)
  40009b: 20 77 6f              and    %dh,0x6f(%rdi)
  40009e: 72 6c                 jb     0x40010c
  4000a0: 64 21 0a              and    %ecx,%fs:(%rdx)

Qui montre ce que je tente d'accomplir: lea 0x10(%rip),%rsi des charges à l'adresse 17 octets après l'instruction lea qui est de l'adresse de 0x400096 où le Hello world chaîne peut être trouvé, et ainsi le code indépendant de la position.

  • Pourquoi 17 octets après (0x10 est de 16 ans)?
  • tortall.net/projects/yasm/manual/html/nasm-effaddr.html dit: RIP is the instruction pointer register, which contains the address of the location immediately following the current instruction mais la lea instruction est de sept octets de long, pas un seul.
InformationsquelleAutor Erik | 2010-07-14