Проблема с функцией CommandLineToArgvW Windows в сборке - PullRequest
0 голосов
/ 06 марта 2012

Я просто пытаюсь распечатать значение argc , используя функцию API окна CommandLineToArgvW в NASM.Вот что у меня есть:

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.

Ответы [ 4 ]

3 голосов
/ 06 марта 2012

Измените _GetCommandLineA на _GetCommandLine * W * CommandLineToArgv ожидает указатель на строку UNICODE.

МАСМ, но примерно так же:

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: \ Projects>

3 голосов
/ 06 марта 2012

Установите точку останова непосредственно перед вызовом CommandLineToArgvW и проверьте параметры, которые вы собираетесь передать.Обратите внимание, что первый передаваемый параметр не является указателем на строку.Это указатель на указатель на строку.

2 голосов
/ 06 марта 2012

Вы используете CommandLineToArgvW со строкой ANSI , используйте GetCommandLineW для получения командной строки в Unicode.

Вы также не являетесьразыменование указателя на командную строку:

push ebx ; pushes ArgC address onto stack
2 голосов
/ 06 марта 2012

Вам нужно использовать GetCommandLineW вместо GetCommandLineA .

...