win32汇编中调用32位自定义的C函数

发布时间:2011年9月25日 作者:未知 查看次数:1856

win32汇编中调用32位自定义的C函数


(以下文章中使用的编译器为masm32 v6.14版, Visual Studio 2010旗舰版)

1. 首先在VS中编辑C函数, 例子如下:

  1. int choose(int a,int b)  
  2. {  
  3.     if(a>=b)  
  4.         return a;  
  5.     else  
  6.         return b;  
  7. }  

   Ctrl+F7编译

 如果出现了如下错误:

错误 1 error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”? e:\source\vc++\mixed\choose\choose\choose.c 8

或是:

错误 1 error C1083: 无法打开预编译头文件:“Debug\choose.pch”: No such file or directory e:\source\vc++\mixed\choose\choose\choose.c 1

则说明你应该取消预编译头:

项目->**属性(Alt+F7), 打开属性页, 把预编译头项, 设置为"不使用预编译头"

这样C函数的obj文件就编译出来了.

2. 编写汇编程序, 程序代码如下:

  1.         .386  
  2.         .model flat,stdcall  
  3.         option casemap:none  
  4.   
  5. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
  6. ;Include 文件定义  
  7. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
  8.   
  9. include windows.inc  
  10. include kernel32.inc  
  11. includelib  kernel32.lib  
  12.   
  13.   
  14. choose  proto c :dword,:dword       ; 声明自己编写的c程序, 包括两个int型变量  
  15. printf  proto C:dword,:dword        ; 声明调用c库函数输出  
  16. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
  17. ;数据段  
  18. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
  19.         .data  
  20.     a   dw      2  
  21.     b   dw      3  
  22.     szFormat    db  '大值为: %d',0  
  23. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
  24. ;代码段  
  25. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
  26.         .code  
  27.  start:   
  28.         invoke  choose,a,b      ; 调用自己编写的c函数  
  29.         invoke  printf,offset szFormat,eax  ; 输出结果  
  30.         invoke  ExitProcess,NULL  
  31. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
  32.         end start  


编译:ml /c /coff cho.asm

3. 链接两个obj文件

在链接之前先保证环境变量的正确性:

masm的lib文件的路径应正确的指向masm的lib文件夹, 如本电脑的masm的lib路径为: E:\masm32\lib

由于调用了c的函数, 所以要设置c的lib路径, 这里用的是vs2010的lib路径, 如本电脑的是: D:\Program Files\Microsoft Visual Studio 10.0\VC\lib

这个c的lib路径设置很重要, 否则链接的时候会提示某个lib文件无法打开.

这里使用的是masm32里带的link文件.

E:\masm32\bin>link /subsystem:console E:\source\VC++\mixed\choose\choose\Debug\cho.obj E:\source\VC++\mixed\choose\choose\Debug\choose.obj

注意:

1. 当本电脑里有多个link文件时, 应该注意自己使用的是正确的link文件, 避免自己错误使用了16位的link文件, 或是别的程序的link文件

2. 32位c程序的int型数据为32位, 故在汇编程序中传进去的两个变量位dd型的.

3. 如果出现以下错误, 则是因为在声明c函数名的时候把函数名后面的c省去了. 比如写成这样就会出现下面的错误: choose proto  :dword,:dword

cho.obj : error LNK2001: unresolved external symbol _choose@8
cho.exe : fatal error LNK1120: 1 unresolved externals

以上转自:http://blog.csdn.net/xietao1233/article/details/6724071

我用的VC++6.0

发现找不到函数,改C函数如下:

#ifdef __cplusplus
extern "C" {
#endif
//
__declspec( dllexport ) int choose(int a,int b)

{
 if(a>=b)
  return a;
 else
  return b;
}

#ifdef __cplusplus
}
#endif

重点是在masm32中的申明:

choose  proto c :dword,:dword       ; 声明自己编写的c程序, 包括两个int型变量

我以前用的是如下申明:

extern choose:proc

这样只能用call 命令来调用。

 


 



版权所有!www.sieye.cn
E.Mail:sieye@sohu.com QQ:66697110