从.c调用MASM32过程

时间:2016-07-30 22:37:39

标签: c masm32

我目前正在使用visual studio。我需要构建一个win32应用程序,需要从C函数调用一个过程,但我总是遇到构建错误:

错误3错误LNK1120:1个未解析的外部

我已将所有内容简化为一个简单的主函数和简单的.asm文件,只有一个过程,我仍然得到相同的构建(或更确切地说是链接)错误。我很茫然。

两者都使用cdecl约定。

MASM32代码(在自己的.asm文件中):

.MODEL FLAT, C
.DATA              

.CODE      

PUBLIC memory_address

memory_address PROC 

    mov eax, DWORD PTR [esp] 

    ret

memory_address ENDP

END

它组装得很好。 .c文件:

#include <stdlib.h>
#include <malloc.h>
#include <stdio.h>

extern int memory_address(int* ptr);

void main()
{
    int *ptr = (int*)malloc(sizeof(int));

    memory_address(ptr);

    while (1) {}

    return;
}

不知道为什么会这样。我已经愉快地使用MASM进行64位应用程序大约一年左右没有任何问题。但我必须制作一个32位应用程序,我没有运气调用MASM32 proc memory_address()。

我赶紧补充说我知道如何在NASM中为32位应用程序执行此操作,并且我知道如何使用MASM为64位应用程序执行此操作。这严格来说是一个MASM32问题。任何建议都会很棒 - 但仅适用于MASM32。感谢。

1 个答案:

答案 0 :(得分:1)

您可以将asm模块构建为DLL。

这一切易于使用STDCALL, 所以相反:

.MODEL FLAT, C

你可以使用:

.model flat, stdcall

只需为yourmodule.asm创建额外的内容即可 yourmodule.def 文件。 在那个地方这些线:

LIBRARY "yourmodule.dll"
EXPORTS memory_address

然后使用: ml.exe / c / coff yourmodule.asm Link.exe / SUBSYSTEM:CONSOLE / DLL /DEF:yourmodule.def yourmodule.obj

在C ++应用程序中,然后删除:

extern int memory_address(int* ptr);

并添加:

typedef void*(__stdcall *PTRmemory_address)(int*);
extern PTRmemory_address    memory_address = NULL; // init as "NOT PRESENT"

HMODULE yourmoduleHMODULE;
yourmoduleHMODULE = GetModuleHandleA("yourmodule.dll"); // ensure valid file path!
if (!yourmoduleHMODULE)
    yourmoduleHMODULE = LoadLibraryA("yourmodule.dll"); // ensure valid file path!

if (yourmoduleHMODULE)
{
    memory_address = (PTRmemory_address)GetProcAddress(yourmoduleHMODULE, "memory_address");
    if (!memory_address)
    { 
        printf("\n  Cannot Find function memory_address in yourmodule.dll");
        exit(1);  // exit application when function in DLL not found
    }
}    
else
{
    printf("\n  yourmodule.dll not found");
    exit(1); // exit application when DLL not found
}

调用你的函数:

int *ptr = (int*)malloc(sizeof(int));

if (memory_address)  // ensure, that your function is present
  memory_address(ptr);
else 
  printf("\n error");

    // ....