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

时间:2016-01-13 01:24:44

标签: linux assembly x86 nasm

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

table

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

-144807325

实际参数计数在ESP + 4处进一步存储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

1 个答案:

答案 0 :(得分:4)

您提到的教程谈论初始流程启动。此时main未运行,C启动代码稍后根据标准C调用约定调用它。因此,在[esp],您有返回地址。另请参阅Linux x86 Program Start Up or - How the heck do we get to main()? by Patrick Horgan