masm输出.obj无法与其他人联系

时间:2013-10-24 08:16:00

标签: assembly build driver linker-errors symbols

任何人都可以告诉我如何将masm输出与其他目标文件链接。例如main.obj。

我正在开发一个Windows内核模式驱动程序,我想将内联asm块移动到单独的.asm文件以获得进一步的要求并防止进一步的困难,例如:x64不支持内联asm。

所以,我将vm.asm源文件添加到项目中,并从构建定制中选择了masm。之后,我为项目类型选择了Microsoft宏汇编程序。当我构建项目时,vm.obj文件已成功为vm.asm文件创建。但我不能从C代码调用asm函数(proc)。它应该是链接错误我认为构建过程不会将obj文件放在一起。

我也试过stdcall和cdecl,但结果是一样的。

我的vm.asm:

.386
.model flat, C
option casemap :none 

PUBLIC _get_vm

_get_vm PROC
      mov eax, 0101h
      db 0fh 
      db 01h 
      db 0c1h
      ret
_get_vm endp
END

这是我的电话:

ULONG vm_id;
extern int _cdecl get_vm();

vm_id = get_vm();

错误: project_ddk \ main.obj:错误LNK2019:函数_DispatchPnP @ 8中引用了未解析的外部符号_get_vm

我的ml.exe命令行:

ml.exe / c / nologo / safeseh / Zi /Fo"%(FileName).obj“/ fl”“/ W3 / errorReport:prompt / Ta

2 个答案:

答案 0 :(得分:1)

以下是我用来测试链接C的一些示例(希望它有帮助)。

main.cpp中:

#include <iostream>
#include <string.h>
#include <windows.h>

extern "C"
{
    void PopTest(void);
};

int main(int argc, char*arg[])
{
    PopTest();
    return 0;
}

TEST.ASM

.486
.model flat, C
option casemap :none

.data

.code

;***********************
;
; Just a demo how to declare functions to be used from C
;
PopTest PROC

    push es
    xor eax,eax
    push eax
    pop es
    pop es

    mov eax, 2134
    push eax
    mov ebx, [esp]
    add esp, 04
    mov ecx, [esp-4]
    ret

PopTest ENDP

END

VS2008中的自定义构建步骤:

D:\Programme\masm32\bin\ml.exe /coff /c test.asm /Fo test.obj
copy test.obj Debug\test.obj
del test.obj

答案 1 :(得分:0)

我从未使用masm创建C函数,但在正常的过程中需要文本段,可能需要定义文本段。

.386
.model flat, C
option casemap :none 

PUBLIC _get_vm
_TEXT SEGMENT
_get_vm PROC
      mov eax, 0101h
      db 0fh 
      db 01h 
      db 0c1h
      ret
_get_vm endp
_TEXT ENDS
END

编辑:我只是尝试制作一个在C中工作的简单程序,我得到了这个并且这有效;

MASM proc;

.386
.model flat, C
option casemap :none

PUBLIC func
_TEXT SEGMENT
func PROC
      mov eax, 2
      ret
func ENDP
_TEXT ENDS
END

C电话;

#include <stdio.h>

int main(){
    int i = 5+func();
    printf("%d",i);
    return 0;
}

CMD;

masm - &gt; ml -c -coff func.asm

C - &gt; gcc prog.c func.obj -o main

输出 - &gt; 7