win32汇编中调用32位自定义的C函数
发布时间:2011年9月25日 作者:未知 查看次数:1856
win32汇编中调用32位自定义的C函数(以下文章中使用的编译器为masm32 v6.14版, Visual Studio 2010旗舰版) 1. 首先在VS中编辑C函数, 例子如下:
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. 编写汇编程序, 程序代码如下:
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 以上转自: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 重点是在masm32中的申明: choose proto c :dword,:dword ; 声明自己编写的c程序, 包括两个int型变量 我以前用的是如下申明: extern choose:proc 这样只能用call 命令来调用。
|
|
|