1

不幸的是,我现在被迫切换到 Windows 来编写汇编代码,而不是使用 Linux。但是当试图链接我由 NASM 生成的 .obj 文件时,它会给出错误`gcc: Createprocess: No such file or directory。”

我的代码:

GLOBAL _main
EXTERN _printf

_main:
    push message 
    call _printf
    add esp, 4
    ret
message:
    db 'Hello, world',10,0

我尝试将我的 .obj 文件移动到与 GCC 相同的目录。我还尝试在与 GCC 相同的目录中编译整个内容。使用批处理文件进行编译时,我没有使用任何环境变量,而是手动更改目录。我还将 GCC 安装在与 G++ 和 MinGW 附带的所有其他编译器相同的目录中。

为什么会出现此错误?

提前致谢

4

1 回答 1

0

这对我有用:

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 安装做任何特别的事情,我想我使用了所有默认设置参数。

于 2012-10-15T02:16:53.880 回答