我的一个项目中需要C和汇编语言混合编程,使用VS2010开发环境,汇编语言部分写在一个独立的.asm文件中,在VS工程中,汇编源文件的“Item Type“ 定义为“Custom Build Tool“。 编译链接成功. 但是调试时发现,C语言文件中函数调用汇编语言文件中的函数可正确工作,但一个汇编文件中的函数调用另一个汇编源文件中的函数时却不能工作,当执行到call指令时,不能正确定位到目标函数,百度了1个多小时,参考了csdn论坛和博客的多个帖子和文章,也没有找到正确答案。最后在微软的官网https://support.microsoft.com/zh-cn/kb/86816上找到正确答案。解决方法,在调用函数所在的文件中,将被调函数声明为绝对地址。如 EXTERN _funname:abs,我之前的声明是 EXTERN _funname:DWORD。
更多的信息:
1. 我的程序生成的是32位应用程序,故在汇编源文件开头,做如下定义
.686P
.model flat
OPTION DOTNAME
2. Custom Build tool 参数定义
Command Line: ml /Zi /coff /c %(FullPath)
Outputs: %(Filename).obj %(Outputs)ml.exe