C++代码中如何调用.asm文件中的函数?

菜鸟一只_热爱ASM 2012-10-29 11:37:07
我看到关于这样的运用,可是我在win7 vc不兼容,而且也比较喜欢vs,我想求助一下VS应该怎么设置呢?或者有别的方法。谢谢了。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
以VC6为例,详细的讲述如何用 .cpp 和 .asm混合编成:

1。工具集成:
1)首先你应该安装汇编器,比如masm,我用的是 Microsoft (R) Macro Assembler Version 6.15.8803,对应的汇编器执行文件时ml.exe,你应该把ml.err,ml.exe 复制到VC的bin目录(我这里是:D:\Program Files\Microsoft Visual Studio\VC98\Bin)

2)在你的project中添加.asm文件,the .asm文件应该和.dsp 位于同一目录。
3)选中project中的asm文件,单击右键,选择settings菜单,弹出一个对话框,打开custom Build选项卡,在commands 中输入:ml /coff /c $(InputName).asm,
在outputs 中输入 $(InputName).obj。
这样,就可以在VC集成环境中自动编译连接你的程序了。

2。函数接口:汇编语言写的函数要被C语言调用,一定要遵循一个规范,调用约定(Calling convention),这个规范定义了参数传递,堆栈平衡等。
1)在Cpp/h文件中声明函数的调用方式:
如 extern "C " void ADD(int *Result, int a,int b);
在cpp文件中调用汇编函数extern "C " 是必须的,在c文件中调用汇编函数不需也不能使用extern "C "。
2)书写汇编程序,汇编语言中的函数名 必须是cpp文件中声明的函数名前加下划线如_Add
第一个参数是 [esp+4],第二个函数时 [esp+8],如果函数有返回值,返回值送入eax,汇编代码中最后一条语句是ret,要注意堆栈平衡.
...全文
993 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
大熊猫侯佩 2012-10-31
  • 打赏
  • 举报
回复
正常VC编译会吗?不会的话自己用VS导出make看。

如果上面汇编你是用来联编vs的则吧最后一行改为 end,然后做:

ml /c /coff /nologo a.asm

生成 a.obj ,然后用 link 把 a.obj和vc编译的文件合并生成 .exe即可
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

将ASM复制到C++里面,再内联
[/Quote]
我要.asm跟.cpp一起编译链接的。不是要内联汇编的。。。
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

提示的很清楚,你的函数声明和定义变量类型不一致。

另外入口点没有定义。
[/Quote]
。。书本源码就是这样的,所以我不懂他怎么成功的。还有大大能否研究一下怎么在VS2012里面混合链接成功,小弟菜鸟,研究半天研究不出来。
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

提示的很清楚,你的函数声明和定义变量类型不一致。

另外入口点没有定义。
[/Quote]
。。书本源码就是这样的,所以我不懂他怎么成功的。还有大大能否研究一下怎么在VS2012里面混合链接成功,小弟菜鸟,研究半天研究不出来。
大熊猫侯佩 2012-10-30
  • 打赏
  • 举报
回复
提示的很清楚,你的函数声明和定义变量类型不一致。

另外入口点没有定义。
大熊猫侯佩 2012-10-30
  • 打赏
  • 举报
回复

.586
.model flat,c

AsmFindArray proto srchVal:dword,arrayPtr: ptr dword,count:dword

.code
AsmFindArray proc uses edi,srchVal,arrayPtr:ptr dword,count

TRUE=1
FALSE=0

mov eax,srchVal
mov ecx,count
mov edi,arrayPtr

repne scasd
jz returnTrue

returnFalse:
mov al,FALSE
jmp short exit
returnTrue:
mov al,TRUE
jmp short exit
exit:
ret
AsmFindArray endp
end AsmFindArray
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

1 你用vc编译器先形成 x.obj文件

2 用masm32生成 asm.obj文件

3 用link联编即可 : link /subsystem:xxx x.obj asm.obj
[/Quote]
下面是书上的例子代码,编译不了obj.提示fatal error A1000: cannot open file 但又没说file是什么,用dos自己nmake也失败了,提示有语法错误,

.586
.model flat,c

AsmFindArray proto
srchVal:dword,arrayPtr: ptr dword ,count:dword

.code
AsmFindArray proc uses edi,srchVal,arrayPtr,count

TRUE=1
FALSE=0

mov eax,srchVal
mov ecx,count
mov edi,arrayPtr

repne scasd
jz returnTrue

returnFalse:
mov al,FALSE
jmp short exit
returnTrue:
mov al,TRUE
jmp short exit
exit:
ret
AsmFindArray endp
end

WJN92 2012-10-30
  • 打赏
  • 举报
回复
将ASM复制到C++里面,再内联
HMGuardian 2012-10-30
  • 打赏
  • 举报
回复
VC不解,gcc 就好说多了……windows都删除了,不然帮你试试……
大熊猫侯佩 2012-10-30
  • 打赏
  • 举报
回复
1 你用vc编译器先形成 x.obj文件

2 用masm32生成 asm.obj文件

3 用link联编即可 : link /subsystem:xxx x.obj asm.obj
yh_no_code 2012-10-30
  • 打赏
  • 举报
回复
分开编译没有弄过!帮顶

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧