我有以下简单的汇编程序(从this website下载)。:
extern printf ; the C function, to be called
section .data ; Data section, initialized variables
msg: db "Hello world", 0 ; C string needs 0
fmt: db "%s", 10, 0 ; The printf format, "\n",'0'
section .text ; Code section.
global main ; the standard gcc entry point
main: ; the program label for the entry point
push rbp ; set up stack frame, must be alligned
mov rdi,fmt
mov rsi,msg
mov rax,0 ; or can be xor rax,rax
call printf ; Call C function
pop rbp ; restore stack
mov rax,0 ; normal, no error, return value
ret ; return
当我尝试使用NASM从命令行构建时,我没有错误,并且它正确地创建了目标文件。然后我使用命令行选项-m i368pe
使用Mingw-w64(ld)(因为我在x64机器上)链接它,但是这失败并显示错误消息:无法识别文件格式。在搜索了一下之后,我发现这与我试图将32位目标文件与64位链接器或其他方式链接的事实有关。但是,这对我来说没有意义,因为我使用-f win64
标志构建了目标文件。另外,我相信-m i386pe
是一个用于链接的64位标志,所以我在这里做错了什么?
我建立/链接的命令是:
构建:nasm -f win64 -o test.obj test.asm
链接:ld test.obj -m i386pe -o test.exe