这对我有用:
ASM 文件:
; file: blahasm.asm
; assemble with nasm (v 2.10, Mar 12 2012): nasm -f elf32 blahasm.asm -o blahasm.o
bits 32
global _blah
_blah:
mov eax, 42
ret
C 文件:
// file: blahc.c
// compile with MinGW x86 (gcc v 4.6.2): gcc -Wall -O2 blahc.c blahasm.o -o blah.exe
#include <stdio.h>
extern int blah(void);
int main(void)
{
printf("blah():%d\n", blah());
return 0;
}
输出:
blah():42
令我惊讶的是,唯一有效的格式是elf32
并且它在 gcc 的 Windows 端口中得到支持,MinGW 就是这样。
更新:
我用 NASM 和 MinGW 创建了一个仅装配程序。
ASM 文件:
; file: nsm.asm
; assemble with NASM (v 2.10, Mar 12 2012): nasm -f elf32 nsm.asm -o nsm.o
; compile (link) with MinGW x86 (gcc v 4.6.2): gcc -Wall -O2 nsm.o -o nsm.exe
bits 32
extern ___main
extern _printf
global _main
section .rdata
textstr:
db "Hello World!", 10, 0
section .text.startup
_main:
call ___main
push textstr
call _printf
add esp, 4
ret
输出:
Hello World!
我正在从“MinGW Shell”(MSYS)运行 gcc,我不需要指定任何额外的命令行参数来使程序与标准库成功链接。我不需要对 MinGW 和 MSYS 安装做任何特别的事情,我想我使用了所有默认设置参数。