Как использовать библиотеку в MASM или, более конкретно,.lib файл?

Я сделал файл.lib с помощью Visual Studio 2010, и теперь я хочу использовать его в masm. Как я могу это сделать? нужна помощь. Я попытался посмотреть в Интернете, но не смог найти точного ответа, как это сделать.

вот ссылка на файл.lib, который я создал с помощью Visual C++ 2010. https://www.dropbox.com/s/pzdd35ktolfl48x/MathFuncsLib.lib

Этот файл содержит только функцию, которая принимает два целых числа в качестве аргументов и возвращает их сумму. Мне нужно использовать эту функцию в одной из моих программ, написанных на сборке Intel с использованием MASM.

Нужна помощь в этой проблеме.

3 ответа

Решение

Я был слишком оптимистичен, говоря, что в сети есть много примеров для комбинации 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

Удачи!

Ваш MathFuncsLib.lib включает в себя украшенные символы и ссылки на другие.libs.

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++ и Assembler, особенно при использовании объектов. Лучше написать C-программу (C и C++- два разных языка!) И интегрировать эти.libs в программу на Ассемблере. В сети есть много примеров для этого.

У меня работает следующий код:

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\lib это путь к msvcprtd.lib,

Masm615 является 16-битным ассемблером и несовместим с.lib-файлами, сгенерированными 32/64-битными компиляторами, такими как VS. Лучшим вариантом было бы использовать 16-битный компилятор, такой как Turbo C++.

Другие вопросы по тегам