【问题标题】:how to use a library in masm or more specifcally a .lib file?如何在 masm 或更具体的 .lib 文件中使用库?
【发布时间】:2014-05-08 18:51:41
【问题描述】:

我使用 Visual Studio 2010 制作了一个 .lib 文件,现在我想在 masm 中使用它。我怎样才能做到这一点?需要帮忙。我试图在互联网上查看它,但找不到任何关于如何执行此操作的确切答案。

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

这个文件只包含一个函数,它接受两个整数作为参数并返回它们的和。我需要在我的一个使用 masm 用 intel 汇编编写的程序中使用这个函数。

在这个问题上需要帮助。

【问题讨论】:

  • 您遗漏了重要信息,例如您使用的调用约定。不要链接到 lib 文件(这是一个二进制文件),而是向我们展示您在构建时使用的 C 代码和汇编代码以及编译器/汇编器选项。

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


【解决方案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

祝你好运!

【讨论】:

  • 您先生绝对是个天才,我必须承认。非常感谢您的帮助。
【解决方案2】:

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

MSVC “装饰”其 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++ 和汇编程序通常不是一个好主意,尤其是在使用对象时。更好的是编写一个 C 程序(C 和 C++ 是两种不同的语言!)并将这些 .lib 集成到一个汇编程序中。网上有很多这样的例子。

我正在运行以下代码:

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:\TMPMathFuncsLib.lib 的路径。 C:\Compiler\Visual Studio Express 2010\VC\libmsvcprtd.lib 的路径。

【讨论】:

  • 我通过这个链接采用了制作那个 .lib 文件的方法:msdn.microsoft.com/en-us/library/ms235627.aspx 这里提到的 add 函数与我想在我的汇编程序中使用的函数相同。
  • 感谢您的代码。我对其进行了测试,它运行良好,但我仍然不明白这段代码是如何工作的。我是在 masm 中导入文件的新手,您能解释一下以下代码的作用以及它是如何工作的吗?包括 \masm32\include\masm32rt.inc ; MASM32 标头尤其是 'pr2' includelib msvcprtd.lib includelib MathFuncsLib.lib ?Subtract@MyMathFuncs@MathFuncs@@SAHHH@Z PROTO SYSCALL Subtract EQU
  • @user3071543:我相应地编辑了帖子。我已经尽力了。 HTH
  • 感谢您的编辑。它帮助我拓宽了我对装配的平庸理解。如果您能给我提供一个教程链接,该链接清楚地描述了如何用 C 编写程序并将这些 .lib 集成到汇编程序中,那将是非常棒的。附言我正在使用 DOSBox。
  • 由于某种原因,当我尝试对 add .. 做同样的事情时,它给了我两个错误。 1)错误A2008:语法错误:EQU 2)错误A2008:语法错误:添加
【解决方案3】:

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

【讨论】:

  • 这是不正确的。 .lib 文件的生成不是汇编器或编译器的工作,而是库管理器 (lib.exe) 的工作。关键是这个库管理器是否可以处理各种 .obj 文件以及链接器是否可以处理最终的 .lib 文件。顺便说一句:Masm615 可以生成 32 位代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2020-02-08
  • 1970-01-01
  • 2013-12-09
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多