如何在 Netwide Assembler Windows x64 中将 argc 打印到控制台?

问题描述 投票:0回答:1

我无法得到

argc
论证的正常结果。在 Windows x64 中,它必须位于
rcx
寄存器中,因此我尝试将其打印到控制台,但得到的结果如下:
2449408

我期望我能得到结果

1
。我使用 Netwide Assembler、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
windows assembly x86-64 nasm
1个回答
0
投票

您正在尝试使用 C 库,因此您有 2 个选择:

在程序中包含所有启动样板代码

将目标文件(

.o
.obj
)与
gcc
(或其他一些C编译器,如MSVC)链接。它将调用自己的链接器(例如
ld
)并神奇地将您的程序与C运行时库(CRT)链接起来。这就像编写 C 程序一样,但是您用汇编步骤(将
.c
变成
.o
)替换了编译步骤(将
.asm
变成
.o
)。

示例:

nasm -f win64 my_file.asm -o my_file.o
gcc my_file.o -o my_file.exe

CRT 链接

如果您坚持从可执行文件的原始入口点开始,您将不得不接受这样一个事实:您没有获得任何参数作为参数,并且您必须自己完成这项工作。考虑使用 kernel32.dll

 中的 
GetCommandLineA()(也可能使用 shell32.dll
 中的 
CommandLineToArgvW())来帮助您。

我还建议在这种情况下避免使用

main
名称,因为它会造成混乱。 GoLink 更喜欢默认名称
start
,而
ld
更喜欢
_start

© www.soinside.com 2019 - 2024. All rights reserved.