You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Windows x64平台用NASM将argc输出到控制台?

Windows x64汇编中获取argc及CommandLineToArgvW调用问题

一、无法正确获取argc参数

在Windows x64环境中,argc应存储在rcx寄存器中,但尝试将其输出到控制台时得到的结果是2449408,预期结果应为1。使用Netwide Assembler(NASM)、Windows 10 x64系统和golink链接器,多次修改代码仍未解决,代码如下:

section .data
    format: db "%d ", 10, 0
section .text
    global main
    extern printf
    main:
        push rbp
        mov rbp, rsp

        sub rsp, 32
        
        mov [rbp+16], ecx
        mov [rbp+24], rdx
        
        mov edx, ecx
        mov rcx, format
        call printf

        mov rsp, rbp
        pop rbp
        xor rax, rax
        ret

使用的编译链接命令:

  • nasm -fwin64 myfile.asm
  • golink /console /entry start myfile.obj kernel32.dll shell32.dll msvcrt.dll

二、CommandLineToArgvW调用失败,返回NULL

执行上述命令后出现错误,打印的错误码为87,但调试器中显示为57,相关代码如下:

section .data
    integerFormat: db "%d 
section .text
    global start
    extern GetLastError
    extern CommandLineToArgvW, GetCommandLineA
    extern printf


    start:
        push rbp
        mov rbp, rsp

        sub rsp, 48

        mov dword [rbp-4], dword 0
        call GetCommandLineA

        mov rcx, rax
        mov rax, [rbp-4]
        mov rdx, rax
        call CommandLineToArgvW
        mov [rbp-12], rax
        call GetLastError
        cmp rax, 0
        jnz PrintLastError

        mov rsp, rbp
        pop rbp

        xor eax, eax
        ret
        PrintLastError:
            mov rcx, integerFormat
            mov edx, eax
            call printf
            mov rsp, rbp
            pop rbp
            mov rax, 1
            ret

另外已知GetCommandLineA可以正常工作,但GetCommandLineW返回类似m\0y\0f\0i\0l\0e\0的字符串(\0表示字符串结束),因此使用了GetCommandLineA,但CommandLineToArgvW返回NULL(即0)。

内容的提问来源于stack exchange,提问作者unerr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 09:55:12