根据互联网上的许多教程,据说你可以找到以下方式构建的命令行参数:
然而,经过一段时间花在测试为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
答案 0 :(得分:4)
您提到的教程谈论初始流程启动。此时main
未运行,C启动代码稍后根据标准C调用约定调用它。因此,在[esp]
,您有返回地址。另请参阅Linux x86 Program Start Up or - How the heck do we get to main()? by Patrick Horgan