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 lalea
instruction est de sept octets de long, pas un seul.
Vous devez vous connecter pour publier un commentaire.
Je crois que vous voulez charger le adresse de votre chaîne en
%rsi
; votre code tente de charger un quadword à partir de cette adresse, plutôt que de l'adresse elle-même. Vous souhaitez:si je ne me trompe pas. Je n'ai pas de linux pour tester, cependant.