我正在尝试使用NASM中的 CommandLineToArgvW 窗口的API函数打印出 argc 的值。以下是我所拥有的:
extern _ExitProcess@4
extern _GetCommandLineA@0
extern _CommandLineToArgvW@8
extern printf
global _start
section .code
Format:
db "%d",10,0
FormatS:
db "%s",10,0
_start:
push ebp
mov ebp, esp
sub esp, 4 ; Create empty space for ArgC
call _GetCommandLineA@0
push eax; Push value beneath ArgC
mov ebx, ebp ; Set ebx to ebp
sub ebx, 4
push dword ebx ; pushes ArgC address onto stack
push dword [ebp - 8] ; pushes pointer to Command Line String
call _CommandLineToArgvW@8
push dword [ebp - 4]
push Format
call printf
push dword 0
call _ExitProcess@4
无论我做什么,argc的值是1.我做错了什么?
我汇编并链接这些命令:
nasm -fwin32 FunctionTests.asm
golink FunctionTests.obj kernel32.dll msvcrt.dll shell32.dll /console /entry _start
FunctionTests.exe hi asdf asdf asdf asdf
如您所见,从最后一行开始,argc应为6。
答案 0 :(得分:3)
在您致电CommandLineToArgvW
之前设置一个断点并检查您即将通过的参数。注意,您传递的第一个参数不是指向字符串的指针。它是指向字符串指针的指针。
答案 1 :(得分:3)
将_GetCommandLineA更改为_GetCommandLine * W * CommandLineToArgv需要指向UNICODE字符串的指针。
MASM但差不多:
start:
push ebp
mov ebp, esp
sub esp, 4
call GetCommandLineW
lea ecx, dword ptr[ebp - 4] ; need the address of local
push ecx ; address of local
push eax ; pointer to unicode string
call CommandLineToArgvW
push dword ptr [ebp - 4] ; value of local
push offset Format
call crt_printf
add esp, 8
; this is all? Then we don't have to restore stack.
push 0
call ExitProcess
end start
这是输出:
D:\ Projects> ConTest.exe boo boo我见到你了
6
d:\项目与GT;
答案 2 :(得分:2)
您需要使用 GetCommandLineW 而不是 GetCommandLineA 。
答案 3 :(得分:2)
您正在使用带有 ANSI 字符串的 CommandLineToArgvW ,使用 GetCommandLineW 以unicode获取命令行。
您也没有取消引用指向命令行的指针:
push ebx ; pushes ArgC address onto stack