探究Linux下参数传递及查看和修改方法

本文详细探讨了Linux X86-64架构下函数参数的传递方式,包括寄存器rdi、rsi等用于存放前6个参数,超出部分使用栈传递。通过分析C语言程序、反汇编代码和GDB调试,展示了参数如何从寄存器压入栈以及如何在不同阶段访问这些参数。文章还提供了使用GDB和SystemTap修改运行时变量的示例,帮助读者深入理解参数传递机制。
摘要由CSDN通过智能技术生成
   X86-64下有16个64位寄存器,其中%rdi、%rsi、%rdx,%rcx、%r8、%r9用作传递函数参数,分别对应第1个参数、第2个参数直到第6个参数,如下图所示(图片来自网络):

  如果函数的参数个数超过6个,则超过的参数直接使用栈来传递。在被调用函数执行前,会先将寄存器中的参数压入堆栈,之后的访问会通过栈寄存器加上偏移位置来访问。下面我们结合程序及其反汇编的结果来看一看。C语言程序如下所示:
# include <stdio.h >
# include <stdlib.h >

static int func2( int i, int j)
{
int k;

k = i + j;
return k;
}

static int func( int fd, const char *ptr, int arg3, int arg4, int arg5,
int arg6, int arg7, int arg8)
{
int ret;

ret = arg7 + arg8;

func2(fd, arg3);

return ret;
}

int main( void)
{
func( 12, "Hello,World!", 3, 4, 5, 6, 7, 8);

return 0;
}
  将上述程序保存为m.c,使用gcc加上-g选项编译,然后使用gdb来进行调试,我们在main调用func的位置及func()和func2()函数三处加上断点,如下所示:
(gdb) b m.c : 26
Breakpoint 1 at 0x4004d4 : file m.c, line 26.
(gdb) b func
Breakpoint 2 at 0x4004ac : file m.c, line 17.
(gdb) b func2
Breakpoint 3 at 0x40047e : file m.c, line 8.
(gdb)
  然后我们在第一个断点处停下,反汇编当前的main函数,查看参数传递方式,如下所示:
(gdb) disassemble /m main
Dump of assembler code for function main :
25 {
0x00000000004004cc < + 0 > : push %rbp
0x00000000004004cd < + 1 > : mov %rsp, %rbp
0x00000000004004d0 < + 4 > : sub $0x10, %rsp

26 func( 12, "Hello,World!", 3, 4, 5, 6, 7, 8);
= > 0x00000000004004d4 < + 8 > : movl $0x8,0x8( %rsp)
0x00000000004004dc
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值