如何在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.asmgolink /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
相关产品推荐
相关产品推荐

