0

谁能告诉我如何将 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

这是我的 c 调用:

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

4

2 回答 2

1

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

主.cpp:

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

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

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

测试.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
于 2013-10-24T09:43:18.900 回答
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 过程;

.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;
}

命令;

马斯->ml -c -coff func.asm

C->gcc prog.c func.obj -o main

输出->7

于 2013-10-24T09:58:13.227 回答