【问题标题】:Accessing command-line arguments in ASM (Win 7)在 ASM (Win 7) 中访问命令行参数
【发布时间】: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。

标签: windows assembly nasm


【解决方案1】:

使用GetCommandLine()

根据this,真正的启动函数(GUI程序中的WinMainCRTSTartup,控制台程序中的mainCRTSTartup)不会从调用者那里接收任何参数。最终传递给 main/WinMain 的命令行正在 RTL 的 xxxCRTStartup 实现中通过 GetCommandLine() 检索。

【讨论】:

    猜你喜欢
    • 2013-02-08
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多