Linux C程序存储$rbp+;4在内存中?我的支票失败了

Linux C程序存储$rbp+;4在内存中?我的支票失败了,linux,function,parameters,gdb,rbp,Linux,Function,Parameters,Gdb,Rbp,我试图学习如何使用rbp/ebp访问ubuntu1604 64位上的函数参数和局部变量。我有一个简单的c文件: #include<stdio.h> int main(int argc,char*argv[]) { printf("hello\n"); return argc; } 我没有发现任何线索表明,$rbp+xBytes中的任何字节都保存了“3”的dword。我的理解或命令有什么错误吗 谢谢 我试图学习如何使用rbp/ebp访问函数参数和局部变量 x86_64不使用堆

我试图学习如何使用rbp/ebp访问ubuntu1604 64位上的函数参数和局部变量。我有一个简单的c文件:

#include<stdio.h>
int main(int argc,char*argv[])
{
  printf("hello\n");
  return argc;
}
我没有发现任何线索表明,$rbp+xBytes中的任何字节都保存了“3”的dword。我的理解或命令有什么错误吗

谢谢

我试图学习如何使用rbp/ebp访问函数参数和局部变量

x86_64
不使用堆栈传递参数;它们在寄存器中传递。因此,在
$rbp
的任何偏移处都找不到它们(这与
ix86
调用约定不同)

要查找参数,您需要查看
$rdi
$rsi
调节器:

Breakpoint 1, main (argc=3, argv=0x7fffffffe3a8) at my.c:4
4     printf("hello\n");

(gdb) p/x $rdi
$1 = 0x3                   # matches argc
(gdb) p/x $rsi
$2 = 0x7fffffffe3a8        # matches argv
x$rbp+4

您几乎肯定不会在
$rbp+4
中找到任何有用的内容,因为它通常会递增或递减8,以存储整个64位值

我试图学习如何使用rbp/ebp访问函数参数和局部变量

x86_64
不使用堆栈传递参数;它们在寄存器中传递。因此,在
$rbp
的任何偏移处都找不到它们(这与
ix86
调用约定不同)

要查找参数,您需要查看
$rdi
$rsi
调节器:

Breakpoint 1, main (argc=3, argv=0x7fffffffe3a8) at my.c:4
4     printf("hello\n");

(gdb) p/x $rdi
$1 = 0x3                   # matches argc
(gdb) p/x $rsi
$2 = 0x7fffffffe3a8        # matches argv
x$rbp+4


您几乎肯定不会在
$rbp+4
上找到任何有用的东西,因为它通常会递增或递减8,以存储整个64位值。

谢谢,那么如何通过$rsi?@HindForsum访问这两个参数呢?如上所示:第一个参数在
$rdi
中,
$rsi
中的第二个参数。谢谢,那么如何通过$rsi访问这两个参数?@HindForsum如上所示:第一个参数在
$rdi
中,第二个参数在
$rsi
中。