我无法得到
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
您正在尝试使用 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
如果您坚持从可执行文件的原始入口点开始,您将不得不接受这样一个事实:您没有获得任何参数作为参数,并且您必须自己完成这项工作。考虑使用 kernel32.dll
中的
GetCommandLineA()
(也可能使用 shell32.dll中的
CommandLineToArgvW()
)来帮助您。
我还建议在这种情况下避免使用
main
名称,因为它会造成混乱。 GoLink 更喜欢默认名称 start
,而 ld
更喜欢 _start
。