为什么 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
根据互联网上的许多教程,据说您可以找到以下结构的命令行参数:
然而,经过一段时间测试我为 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