gpt4 book ai didi

c - 从堆栈的角度来看,为什么 main 函数与其他函数不同

转载 作者:太空宇宙 更新时间:2023-11-04 06:23:13 24 4
gpt4 key购买 nike

我正在学习使用 gdb,但我有点困惑。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void g(char *password) {
}

int main(int argc, char *argv[]) {
if(argc > 1)
{
g(argv[1]);
}
}

因此对于常规函数(本例中的 g()),如果我想检查函数参数,那将是 ebp+8、ebp+12.. 等。但是在main当我尝试检查命令行参数时的函数(例如argv[1]`)在这种情况下,以前检查参数的方法似乎不起作用。所以我的问题是:

  1. argv 的内存是否动态分配(使用 malloc 之类的东西)?
  2. 为什么不同大小的参数会改变 argv 本身的地址?(“A”是 0xbffff084 但“A”x10 是 0xbffff074)
  3. 为什么 argv 离 ebp 这么远?(在我的例子中,ebp 出现在 0xbfffefe8argv 0xbffff084当我提供 "A" 作为命令行参数时)
  4. 什么是命令行参数和 ebp 寄存器?
  5. 最后一个问题(不是关于这个主题,而是......)如何查看文件的实际内容?我的意思是当程序在程序集开始之前运行时,有一些指令正在运行。例如检查文件是否与您的操作系统兼容等...
    抱歉,如果问题听起来很愚蠢,我是 gdb 的新手。谢谢。

最佳答案

也许这澄清了。在使用 GCC 和 GAS 组装相同代码时发现了这一点:

# GCC
# Stack is:
#ESP -> ret addr
# argc
# argv -> argv[0] -> "program name"
# argv[1] -> "Key"
# argv[2] -> "Infile"
# argv[3] -> "Outfile"

# GAS
# Stack is:
#ESP -> argc
# argv[0] -> "program name"
# argv[1] -> "Key"
# argv[2] -> "Infile"
# argv[3] -> "Outfile"

我记得“argv-list”是由操作系统构建的。

关于c - 从堆栈的角度来看,为什么 main 函数与其他函数不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30618895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com