访问 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
选项。
所以我目前正在尝试使用 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
选项。