关于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
相关产品推荐
相关产品推荐

