任何人都可以告诉我如何将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
答案 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