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

关于lea rax,[rip ±0xeb3]中±含义及RDI作用的技术咨询

x86_64汇编疑问解答:LEA指令中的±符号与RDI寄存器用途

我在VMware中的Kali Linux环境下学习汇编语言,使用Ryzen 5处理器。针对以下代码片段,有两处疑问:

原C代码

#include<stdio.h>

int main(){
        int i;
        for(i = 0 ; i < 10 ; i++){
                printf("Hello World!\n");
        }
        return 0;
}

GDB反汇编结果

(gdb) disassemble main
Dump of assembler code for function main:
   0x0000000000001139 <+0>:     push   rbp
   0x000000000000113a <+1>:     mov    rbp,rsp
   0x000000000000113d <+4>:     sub    rsp,0x10
   0x0000000000001141 <+8>:     mov    DWORD PTR [rbp-0x4],0x0
   0x0000000000001148 <+15>:    jmp    0x115d <main+36>
   0x000000000000114a <+17>:    lea    rax,[rip±0xeb3]        # 0x2004
   0x0000000000001151 <+24>:    mov    rdi,rax
   0x0000000000001154 <+27>:    call   0x1030 <puts@plt>
   0x0000000000001159 <+32>:    add    DWORD PTR [rbp-0x4],0x1
   0x000000000000115d <+36>:    cmp    DWORD PTR [rbp-0x4],0x9
   0x0000000000001161 <+40>:    jle    0x114a <main+17>
   0x0000000000001163 <+42>:    mov    eax,0x0
   0x0000000000001168 <+47>:    leave  
   0x0000000000001169 <+48>:    ret    
End of assembler dump.

补充:GDB版本信息

gdb -v        
GNU gdb (Debian 12.1-3) 12.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

疑问1:lea rax, [rip ± 0xeb3]中的±符号含义

这个±是GDB的显示格式标记,实际对应RIP相对寻址的偏移量正负属性。在x86_64架构中,RIP相对寻址是基于当前指令的下一条指令地址计算目标地址。

此处实际是正偏移,指令等价于lea rax, [rip + 0xeb3],注释里的# 0x2004就是计算后的目标地址——也就是字符串"Hello World!\n"在程序数据段的存储位置。计算逻辑:当前LEA指令地址为0x114a,指令长度7字节,下一条指令地址是0x114a + 7 = 0x1151,加上偏移量0xeb3后得到0x1151 + 0xeb3 = 0x2004,与注释完全匹配。GDB用±只是统一标识偏移量的正负可能性,这里实际为正偏移。

疑问2:更新后的RDI寄存器用途

这是因为x86_64平台遵循System V AMD64 ABI调用规范:函数的第一个参数存储在RDI寄存器中,第二个在RSI,以此类推。

代码中将RAX里的字符串地址(0x2004处的"Hello World!\n")赋值给RDI,是为后续调用的puts@plt函数传递参数——puts函数的唯一参数就是要输出的字符串起始地址,因此RDI在这里承担了传递函数输入参数的作用。


内容的提问来源于stack exchange,提问作者Karan Tejas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 01:15:40