【发布时间】:2014-02-21 22:52:04
【问题描述】:
我在使用 ASM 访问命令行参数时遇到问题。 以前没遇到过这个问题,所以有点莫名其妙……
我使用的汇编器是 NASM。
从 nasm -v 粘贴:
NASM version 2.11 compiled on Dec 31 2013
作为链接器,我使用 GOLINK 作为链接器。
来自golink /h的相关信息:
GoLink.Exe Version 0.28.0.0 - Copyright Jeremy Gordon 2002/12 - JG@JGnet.co.uk
这是我要修复的代码:
pop edx ; Return pointer
pop ebx ; ARGC
pop ecx ; ARGV
push ebx ; Should push ARGC onto the stack
push digit ; db '%d', 10, 0
call printf ; Call printf
我正在使用:
nasm -f win32 file.asm
链接使用:
golink /console file.obj msvcrt.dll user32.dll kernel32.dll
(我在源代码后面使用了来自 msvcrt.dll、user32.dll 和 kernel32.dll 的函数)
在组装或链接过程中没有错误。
执行file.exe helloArg1 helloArg2时,输出为:
2130567168
这显然不是正确的参数数量...
我高度怀疑我搞砸了一些简单的东西......
我目前正在运行 x64 Win 7 (SP 1) 机器。
任何意见将不胜感激。
【问题讨论】:
-
您的切入点是什么?如果是 main 或 WinMain,则命令行是常规 C 参数 - 分别为 argv 或 lpCmdLine。
-
汇编器是否有可能自动生成堆栈帧指针头代码,这将是 push ebp |移动 ebp, esp ?如果是这样,请在执行 printf 之前尝试执行一条额外的弹出指令 (pop ebp)。
-
@SevaAlekseyev:使用 main 或 WinMain 作为入口点不走运。不过感谢您的提示!
-
@rcgldr:感谢您的反馈。我试过你描述的,但遗憾的是,没有雪茄......
-
然后调用
GetCommandLine(A/W)API。