如何在masm或更具体的.lib文件中使用库?

时间:2014-05-08 18:51:41

标签: visual-studio-2010 visual-c++ assembly masm masm32

我使用visual studio 2010创建了一个.lib文件,现在我想在masm中使用它。我怎样才能做到这一点?需要帮忙。我试图在互联网上查看它,但无法找到关于如何做到这一点的任何确切答案。

这是我使用Visual C ++ 2010创建的.lib文件的链接。 https://www.dropbox.com/s/pzdd35ktolfl48x/MathFuncsLib.lib

此文件仅包含一个函数,该函数将两个整数作为参数并返回它们的总和。我需要在我使用masm编写的intel程序集中的一个程序中使用此函数。

在这个问题上需要帮助。

3 个答案:

答案 0 :(得分:1)

我太乐观了,说网上有很多MASM-C组合的例子。这是Visual Studio Express 2010(无Masm32)的逐步说明:

<强> MathFuncsLib.cpp:

extern "C" {
    int Addition (int a, int b) { return a + b; }
    int Subtraction (int a, int b) { return a - b; }
    int Multiplication (int a, int b) { return a * b; }
    int Division (int a, int b) { return a / b; }
} // end of extern "C"

<强> MathFuncsLib.asm:

.MODEL flat, stdcall

includelib kernel32.lib
ExitProcess PROTO STDCALL, :DWORD

includelib msvcrt.lib
printf PROTO C, :VARARG

includelib MathFuncsLib.lib
Addition PROTO C, :SDWORD, :SDWORD
Subtraction PROTO C, :SDWORD, :SDWORD
Multiplication PROTO C, :SDWORD, :SDWORD
Division PROTO C, :SDWORD, :SDWORD

.data
    arg1 SDWORD 100
    arg2 SDWORD 10
    result SDWORD ?

    fmt1 db "Addition: %u",10,0
    fmt2 db "Subtraction: %u",10,0
    fmt3 db "Multiplication: %u",10,0
    fmt4 db "Division: %u",10,0

.code
main PROC

    invoke Addition, arg1, arg2
    mov result, eax
    invoke printf, ADDR fmt1, result        ; printf (fmt1,result)

    invoke Subtraction, arg1, arg2
    mov result, eax
    invoke printf, ADDR fmt2, result

    invoke Multiplication, arg1, arg2
    mov result, eax
    invoke printf, ADDR fmt3, result

    invoke Division, arg1, arg2
    mov result, eax
    invoke printf, ADDR fmt4, result

    invoke ExitProcess, 0

main ENDP

END main

<强> MathFuncsLib.cmd:

@ECHO OFF
call "C:\Compiler\Visual Studio Express 2010\VC\vcvarsall.bat"
rem Adapt it with path to your 'vcvarsall.bat'

cl.exe MathFuncsLib.cpp /c
lib.exe MathFuncsLib.obj
ml.exe MathFuncsLib.asm /link /subsystem:console

MathFuncslib.exe
祝你好运!

答案 1 :(得分:0)

您的MathFuncsLib.lib包含装饰符号和对其他.lib的引用。

MSVC&#34;装饰&#34;它的C ++ - 符号,即符号不仅包含名称,还包含参数,类型等 - 整个声明。如果您致电DUMPBIN.EXE MathFuncsLib.lib /SYMBOLS,您可以看到存储在.lib中的符号并找到:

067 00000000 SECT19 notype () External | ?Subtract@MyMathFuncs@MathFuncs@@SAHHH@Z (public: static int __cdecl MathFuncs::MyMathFuncs::Subtract(int,int))

?Subtract@MyMathFuncs@MathFuncs@@SAHHH@Z是装饰符号,(public: static int __cdecl MathFuncs::MyMathFuncs::Subtract(int,int))是未修饰的内容。 MASM无法自动解开符号,因此您必须手动浏览符号并将整个符号放在PROTO指令中。以下等号对以后的调用很有用。

将C ++和Assembler混合使用通常不是一个好主意,尤其是在使用对象时。更好的是编写一个C程序(C和C ++是两种不同的语言!)并将这些.libs集成到Assembler程序中。网上有很多例子。

我已经运行了以下代码:

<强> TEST.ASM:

include \masm32\include\masm32rt.inc        ; MASM32 headers especially 'pr2'

includelib msvcprtd.lib
includelib MathFuncsLib.lib

?Subtract@MyMathFuncs@MathFuncs@@SAHHH@Z PROTO SYSCALL
Subtract EQU <pr2 PTR ?Subtract@MyMathFuncs@MathFuncs@@SAHHH@Z>

.data
    int1 SDWORD 100
    int2 SDWORD 10
    result SDWORD ?

.code
main PROC

    invoke Subtract, int1, int2
    add esp, 8
    mov result, eax

    printf ("%i\n",result);

    invoke ExitProcess, 0

main ENDP

END main

<强> TEST.CMD:

@ECHO OFF 
SET PATH=C:\masm32\bin; 
SET LIB=C:\TMP\;C:\Compiler\Visual Studio Express 2010\VC\lib; 
ml.exe /nologo /coff test.asm /link /subsystem:console /opt:noref /ignore:4044 /nologo 
test.exe

在我的测试用例C:\TMP中是MathFuncsLib.lib的路径。 C:\Compiler\Visual Studio Express 2010\VC\libmsvcprtd.lib的路径。

答案 2 :(得分:-1)

Masm615是一个16位汇编程序,与使用32位64位编译器(如VS)生成的.lib文件不兼容。更好的选择是使用像Turbo C ++这样的16位编译器。