You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于x86汇编LEA指令及RIP相对寻址的技术问询

拆解lea 0xec4(%rip),%rdi的执行逻辑疑问

首先,咱们先把你计算地址时的核心错误捋清楚——你误解了x86-64中RIP相对寻址的基准点!

你看GDB给的注释:lea 0xec4(%rip),%rdi # 0x555555556004,这个注释里的0x555555556004才是字符串真正的地址。为什么你算出来的是0x555555555ffd?因为x86-64的RIP相对寻址,偏移量是相对于下一条指令的地址,而不是当前正在执行的指令地址。

咱们一步步算:

  • 当前执行的lea指令在地址0x555555555139,这条指令的长度是7字节(你可以用x/i 0x555555555139确认)
  • 下一条指令的地址就是0x555555555139 + 7 = 0x555555555140
  • 再加上偏移量0xec4:0x555555555140 + 0xec4 = 0x555555556004,这就是GDB注释里的正确地址,你去查看这个地址,肯定能找到你的"Hello World"字符串。

然后你说的“执行该指令后,该地址处被设置对应值”是个误解:lea指令全称是Load Effective Address,它的作用只是计算出有效地址,然后把这个地址加载到目标寄存器(这里是%rdi)里,它根本不会修改任何内存内容。那个0x555555556004地址在程序加载时就已经把字符串存在里面了(属于只读数据段.rodata),你之前只是找错了地址,才误以为执行指令后内存被修改。

最后再结合你的调用场景:x86-64的System V调用约定里,函数的第一个参数存在%rdi寄存器,所以这条lea指令就是把字符串的地址放到%rdi里,作为后续puts函数的输入参数,这样puts才能找到要打印的内容。


内容的提问来源于stack exchange,提问作者Mahesh C. Regmi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 19:22:27