汇编:__p___argv 的返回值

标签 assembly visual-c++ x86 argv calling-convention

我正开始学习组装和逆向工程。我知道这是一个非常基本的问题,但我仍然不能 100% 确定我是否得到了正确的答案。 __p___argv 返回传递给程序的参数,并将返回值存储在 eax 中。
我的问题与代码有关:

call    __p___argv
mov     edi, [eax]
  • 据我了解,eax 将包含 argv[0] 的内存地址,这是正确的吗?
  • argv[0]实际上并不是用户传递的第一个参数而是其他的东西,而用户传递的参数是从argv[1]开始的?
  • 由于 [eax] 将访问 eax 中指定位置的内存,因此 argv[0] 的值将移动到 edi

最佳答案

在 VC++ 中,__p___argv 声明如下:

__declspec(dllimport) char***    __cdecl __p___argv (void);

在 MinGW 中,__p___argv 声明如下:

extern char***   __p___argv(void);

在这两种情况下,函数都会返回一个指向包含 eax/rax 中 argv 数组地址(即第一个元素的地址)的位置的指针>.

用户传递的第一个参数始终是argv[1],该参数的地址存储在argv数组的第二个元素中。因此,您必须首先取消引用 eax/rax,然后向结果地址添加 4/8 字节,以获取用户传递的第一个参数的地址。

您也可以使用__argv,它是一个相当于*__p___argv()的变量。

关于汇编:__p___argv 的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54655387/

相关文章:

c++ - ecx 寄存器是否用于传递静态函数调用中的参数之一?

c++ - 无法从头文件访问函数

windows - 我无法获取崩溃转储文件

自定义内核不读取全局变量和 char*

plugins - 如何为 ollydbg 2.x.x 设置插件?

c++ - 在VS2010 Debug模式下启用多核编译?

assembly - 代码在哪里可以更有效地检查输入字符是否为元音?

windows - 16 位程序是否在 32 位操作系统上以虚拟 8086 模式运行?

linux - linux中的 'registering an ISR in DOS'相当于什么

c - 了解 gdb 生成的程序集