访问 32 位程序集上的 cmdline 参数

Accessing cmdline arguments on 32-bit assembly

所以我目前正在尝试使用 masm 获取命令行参数,这是我目前所做的:

.386
.MODEL FLAT

includelib kernel32.lib
includelib msvcrt.lib

__getmainargs PROTO C :DWORD
printf        PROTO C :DWORD

.data
            str_argv     db "argv[1]: %s",0
.fardata?
            argc    dd ?    
            argv    db 255 DUP(?)
            env     dd  ?

.code
START:
            push 0
            push OFFSET env
            push OFFSET argv
            push OFFSET argc
            call  __getmainargs
            add   esp, 4*4 ;4 args
 
            push  [edi]
            push  OFFSET str_argv
            call  printf
            add   esp, 4 * 2 ;2 args

            ret
END START

然而,这 returns 我是一个垃圾字符串,不对应于 cmdline 参数,在本例中为模块名称。

知道为什么这不起作用吗? -> 还有其他方法可以访问 cmdline args 吗?

提前致谢

您在未将正确值输入 edi 的情况下推送 [edi]

argv 的声明更改为 argv dd ?

然后将push [edi]改为:

mov edi,argv
push dword ptr [edi+4]

并确保在链接时使用 /SUBSYSTEM:CONSOLE 选项。