【问题标题】:Use C function in MASM programm在 MASM 程序中使用 C 函数
【发布时间】:2020-07-27 05:29:48
【问题描述】:

我有 C 函数,我想在我的 MASM 程序中使用它。

C 文件:

#include <stdio.h>

int go() {
    printf("Hello\n");
    return 10;
}

我在 gcc 中使用了这个命令:gcc -c go_func.c 在我得到go_func.obj

之后

但是,我无法编译/翻译我的 MASM 程序,因为那里没有 go 函数的地址。也许我需要创建 dll(静态或动态)?

prog.asm:

.386p
.model flat, stdcall
; include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\msvcrt.inc
include c:\masm32\include\kernel32.inc

includelib c:\masm32\lib\msvcrt.lib
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib

extern go@0:NEAR

_data segment dword public use32 'data'

_data ends

_text segment dword public use32 'code'

START:
    call go

_text ends

end START

我不能调用那个函数,因为我没有指向函数的指针?

【问题讨论】:

  • 你不需要它。链接器负责处理它。当您有两个不同的 C 文件并从 file1.c 调用 file2.c 中的函数时,情况完全相同。
  • 好的,但为什么我会收到此消息? prog.asm(24) : error A2006: undefined symbol : go
  • 这是属于问题的关键信息。请edit您的问题并将所有相关信息放在那里
  • 完全不确定,试试extern go:NEAR

标签: c include call masm extern


【解决方案1】:

您希望 a PROTO declaration 用于告诉 MASM 使用 C 调用约定的函数。在这种情况下,应该是 C,但不是 NEAR(这是 80 年代过时的 16 位调用约定)。

【讨论】:

  • 我添加了go PROTO NEAR C,它正在工作,当我尝试使用printf 时,链接器出现错误。 addf.obj : error LNK2019: unresolved external symbol ___acrt_iob_func referenced in function _printfaddf.obj : error LNK2019: unresolved external symbol ___stdio_common_vfprintf referenced in function __vfprintf_l main.exe : fatal error LNK1120: 2 unresolved externals
  • 您需要链接到您的 C 函数调用的 C 运行时库。 (您也应该不需要需要NEAR。)
  • 您需要哪个 C 运行时库取决于您是否为 x86_64-pc-mingw32x86_64-pc-msvc 编译了 C 目标文件。我在这里推荐后者,它允许您链接到 MSVCRT,或使用 MSVC 链接器。它与 MS 更兼容。
  • 我在 Clang 上取得了成功,如果 GCC 不能很好地与 MSVC 配合的话。或者 GCC 链接器可能会接受您的 MASM 目标文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 2022-01-13
相关资源
最近更新 更多