为什么 main() 函数的 argc 在 ESP+4 而不是 ESP+0?

Why argc of main() function is at ESP+4 and not ESP+0?

根据互联网上的许多教程,据说您可以找到以下结构的命令行参数:

然而,经过一段时间测试我为 NASM 编写的汇编代码后,我发现 ESP 的值是一些数字,例如:

-144807325

实际参数计数存储在更远的 4 个字节处,在 ESP+4。

知道 ESP+0 存储了什么吗?为什么它与许多教授汇编的文章不同?

您可以在下面找到我重现此问题的代码:

section .data
    msg db  "%d", 0xA

section .text
    global main
    extern printf

main:
    push dword [esp + 0] ; or [esp + 4]
    push msg
    call printf
    pop eax
    pop eax
    mov eax, 0
    ret

您提到的教程讨论了初始进程启动。此时 main 不是 运行,它稍后由 C 启动代码根据标准 C 调用约定调用。因此,在 [esp] 你有 return 地址。另见 Linux x86 Program Start Up or - How the heck do we get to main()? by Patrick Horgan