linux 汇编rip,如何在64位汇编程序中使用RIP相对寻址?

如何在AMD64架构的Linux汇编程序中使用RIP相对寻址?我正在寻找一个使用AMD64 RIP相对地址模式的简单示例(Hello world程序).

例如,以下64位汇编程序将与普通(绝对寻址)一起使用:

.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"

我猜测使用RIP相对寻址的相同程序将是这样的:

.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"

编译时,正常版本运行正常:

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

但我无法使RIP版本正常工作.

有任何想法吗?

---编辑----

Stephen Canon的回答使RIP版本起作用.

现在当我反汇编RIP版本的可执行文件时,我得到:

objdump -d你好

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)

这显示了我想要完成的事情:lea 0x10(%rip),%rsi在地址0x400096之后的地址为0x400096之后加载地址17个字节,其中可以找到Hello世界字符串,从而产生与位置无关的代码.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值