将MASM中的库调用为C或C ++

时间:2014-05-10 20:28:01

标签: c++ c masm

我一直试图在c中调用一个用masm制作的库。 我已经设法从程序集MASM创建一个.lib文件。 但我不知道如何将其称为C语言作为库。 这是.lib文件 https://www.dropbox.com/s/d9d8cjbxmo51yqg/main.lib

需要帮助。 感谢

2 个答案:

答案 0 :(得分:0)

基本想法很简单:

  1. 使用C调用约定编写(外部可见的)汇编语言函数。
  2. 为每个功能编写C兼容的原型/声明。
  3. 根据需要调用函数。
  4. 总体思路看起来像这样(警告:未经测试的代码):

    ; masm file
    .model flat, c
    
    .code
    
    plus1 proc input:dword
        mov eax, input
        add eax, 1
        ret
    plus1 endp
         end
    

    C / C ++标题:

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    int plus1(int);
    
    #ifdef __cplusplus
    }
    #endif
    

    致电代码:

    #include "header.h"
    
    int main() { 
       int x = plus1(14);
    }
    

答案 1 :(得分:0)

哦,伙计。这个问题很严重。在visual studio中的32位masm .asm文件中,那个" .model flat,c"很关键。特别是" c"。由于某种原因,64位masm汇编并不需要它。但如果你试着打电话给extern" C"从程序集中的C ++或C代码定义函数,32位赢得链接,它会抱怨未解析的符号,无论在asm中定义EXTERN符号:PROC。

与64位相比,这是一种奇怪的传统32位事物。

除此之外,对于你的问题,我认为你只想声明你的asm函数PUBLIC,只是" PUBLIC functionname"在你的asm中,然后你不需要标题或任何东西,只需用" extern"来定义它们。或者extern" C"在您调用的C / C ++代码中,它将在汇编对象和链接中找到它们。