社区
汇编语言
帖子详情
如何在VC里面调用TASM编写的函数?
zbl101
2004-08-23 04:56:45
急问
老大们发表一下意见
...全文
86
5
打赏
收藏
如何在VC里面调用TASM编写的函数?
急问 老大们发表一下意见
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zbl101
2004-08-25
打赏
举报
回复
这个是MASM,有没有TASM的?
大熊猫侯佩
2004-08-23
打赏
举报
回复
汇编的程序往往不是独立编写使用的,它经常被其它高级语言调用。
在开发中需要高速的代码的时候,我就会把他做成汇编的子程序,然
后让VC的程序来调用。
在WIN32平台上的汇编的编写使用的模式不同于DOS,在DOS上写程序
往往使用small、large 等模式,但是在WIN32上一定要使用flat模式。
也就是说需要在源文件中定义.model flat。
在老式的C上,函数名汇编成 _func() 这样的形式,但是C++就没有那
么简单了。C++的目标代码中的函数名与源代码中的函数名非常的不同。
所以需要在使用汇编子程序的时候用 extern "C"指明这个按照C的习惯
来编译。
下面这个例子是用qsort()对整数数组进行排序,CompInt()使用汇编
写的比较两个数据大小的回调函数。CompInt1()使用C++写的。大家
可以比较一下这两个函数的速度上的差异。
汇编部分的编译方法,形成.obj文件后把它加入到你的VC工程中去。
ml /c XXX.asm
//#######################################################################
// VC代码部分
#include "stdafx.h"
#include
#include "stdio.h"
#include
// 汇编自函数的原型声明
extern "C" int CompInt(const void*, const void*);
void OutInt(int x, int y)
{
printf("%d %d ", x, y);
}
int CompInt1(const void *p1, const void *p2)
{
if(*(int*)p1 > *(int*)p2)
return 1;
else if(*(int*)p1 < *(int*)p2)
return -1;
else
return 0;
}
#define SIZE (1024*1024)
int a[SIZE];
LARGE_INTEGER t0, t1, f;
void main()
{
int i;
srand(102344);
for(i=0; i{
a[i] = rand()*10*SIZE/RAND_MAX;
}
printf(" ");
puts("sorting...");
QueryPerformanceFrequency(&f);
QueryPerformanceCounter(&t0);
qsort(a, SIZE, sizeof(int), CompInt);
printf("------------------------complete ");
QueryPerformanceCounter(&t1);
printf("t = %lf ", (double)(t1.QuadPart-t0.QuadPart)/((double)(f.QuadPart)));
}
#################################################################################################
// 汇编代码部分
.586
.MODEL FLAT
_OutInt PROTO NEAR32,
.CODE
_CompInt PROC
push ebx;
push ecx;
movecx, [esp+12];// 取参数
mov eax, [ecx];
mov ecx, [esp+16];
mov ebx, [ecx]
;push eax;// 调用C中的子函数,还没有在C++上面试通
;push ebx; // 另外,我发现C的函数不会保护寄存器,很奇怪
;push eax; // 所以要自己保护寄存器
;push ebx;
;call _OutInt;
;add esp, 8
;pop ebx;
;pop eax;
cmp eax, ebx; // 比较,分三种情况返回
jc l_c;
jz l_z;
mov eax, 1
pop ecx;
pop ebx
ret;// a>b 返回
l_z:
mov eax, 0;// 相等
pop ecx; // 清零的方法比较傻,请勿耻笑
pop ebx
ret
l_c:
mov eax, 0ffffffffh;// a < b
pop ecx;
pop ebx
ret
_CompInt ENDP
END
zbl101
2004-08-23
打赏
举报
回复
如果是tasm32呢?
怎么调用,,
zbl101
2004-08-23
打赏
举报
回复
tasm32
sorry,我说错了
Areslee
2004-08-23
打赏
举报
回复
不行,VC是32位的,
TASM是16位的
C语言做的系统(源代码)
怎样用C语言写操作系统 尽管我的题目是“用C语言写操作系统”,但是,仅仅使用C语言是写不出操作系统的。我看到很多篇关于自己动手开发操作系统的文章,几乎全来自一篇叫“Write Your Own Operating System Tutorial”英文文章,而且,使用的全是汇编语言。如今能够精通汇编语言的人已属凤毛麟角,而且现代操作系统的主体部分是用C语言写的,难道所谓的“Own Operating System”只能用汇编语言吗?在下不才,使用C语言(在某些部分必须结合汇编语言)写了一个可以与上述文章中提到的操作系统相媲美的操作系统,抛砖引玉,希望能够将其发展成为真正的中国人自己的操作系统。 我是在Windows环境下开发的,而不是大多数人选择的Linux环境。开发工具也是Microsoft公司的开发工具:masm615和
VC
15。微软公司的masm流传甚广,大家应该不陌生。对
vc
15可能较陌生,
vc
15堪称开发DOS程序的最“高档”编译器(尽管有很多BUG)。如果实在找不到这些开发工具,使用
TASM
、Turbo C或者Borland C++都是可以的。所给出的例子以masm615和
vc
15为准,转移到
TASM
、TC或BC平台,应该不难。有一条原则需要注意,在这里,源码必须使用TINY模式编译,也就是说,必须生成实模式代码。
新版WIN32汇编开发环境介绍及RadAsm简明教程.docx
。。。
RadASM 中文汉化版
程序名称:RadASM 版 本:2.2.1.9 汉 化 人:cao_cong 联系方式:cao_cong_hx@yahoo.com.cn 使用说明: 此汉化增强版根据RadASM作者网站正式发布的 2.2.1.9 版汉化,可对中文完美支持,可编译DOS下的程序并可看到运行结果。这个版本增强了对 C 编译器的支持,增加了从已有具体的更新内容请大家参考安装目录下的 WhatsNew.txt。增强版中附带的 MASM32 更新为 10.0,我在其中放了开发驱动的相关文件,安装后即可使用,可以直接开发驱动程序。我还写了一篇《如何配置RasASM来支持你的编译器》的文章放在安装包中,希望能给大家在为 RadASM 配置新的编译器时提供一点参考。汉化增强版适合于未安装Masm32及Viusual C++的用户,添加了RadASM的帮助文件及Win32 Api等帮助文件。RadASM可通过添加ini文件来支持别的语言,可以自己配置ini文件来支持你所使用的编程语言。此汉化增强版根据网友aboil的建议,添加了我最新修正的 OllyDBG 汉化第二版,选择安装后路径会自动设置好,直接可在RadASM中调试你编译后的程序。 注意: 1、如果你曾安装了以前版本的RadASM汉化增强版,请不要卸载,只需覆盖安装即可。安装版本除了你选择了注册文件类型会在你的注册表中添加数据(可到ICON目录下查看具体添加内容,如果选择卸载同样会删除这些数据)外,不会产生别的垃圾文件,所以没必要卸载。因为卸载时可能把你安装后新建的一些工程一并删除,请谨慎使用卸载(默认在Masm和Cpp中新添加的工程不会被删除,但还是小心一点比较好)。若必须要卸载的话,请把你安装后新建的工程及配置文件备份到其它目录,再执行卸载! 2、这个版本我去掉了
TASM
5.0 的安装文件(主要为减小安装包体积),若要编译
Tasm
的程序的话请大家自己去下载
TASM
。 3、考虑到在有的未装
VC
的机器上测试时,编译时会提示找不到MSPDB60.DLL的错误,我在这个安装版本中复制了一个
VC
的MSPDB60.DLL到你的系统目录,因为有些程序可能会用到它,所以在卸载时未作处理。你要是不需要的话,可到你的系统目录手工删除(建议保留这个文件)。 4、如果你第一次编译 MASM 的 Dos App,可能会在构建的时候提示找不到 *.obj 文件,其实这时 *.obj 文件已经生成了。简单的方法就是重新启动一下 RadASM,再编译、构建时就正常了。 增强版主要更新: 1、包含了编译 Win32 Asm 、C++ 的必须文件及我汉化的 OllyDBG(安装时需选择OllyDBG、Masm32及
VC
6.0这几个组件)。 2、添加了用于RadASM关联汇编文件的图标(安装时需选择文件关联组件),安装后你可在安装目录下的Icon目录内使用你喜欢的图标来定制关联文件的显示图标(替换图标时请把你需要替换的图标更名为原目录下的对应图标名称)。 3、添加了由怜香整理的8086汇编教程、Venjiang整理的 Win32 汇编教程、陈国强整理的Win32 API参考(VB描述)、www.
vc
ok.com整理的C语言教程及经典的 Windows 程序设计电子书。 4、添加了一个Cpp的对话框程序模板文件。 5、添加了一个Masm的注册机程序示例,位于Masm的工程目录下的ASMkeyg文件夹内,推荐大家看一下。 060621新增: 1、把RadASM作者另一个资源编辑工具ResEd的汉化版也打包放在安装目录下,虽然RadASM自带有可视化的资源编辑器,但这个ResEd工具有些时候还是很有用的,你可以可视化的编辑其他的资源脚本,很方便。这个工具我以RadASM网站上的最新版本为基础汉化的。 2、从WinASM中提取了两个模板(MDI和SDI模板),放了一个简单的注册机模板。 3、放了一个可以在对话框程序中添加调整对话框控件大小代码的插件 KSresizer,已汉化并配置好了。把作者提供的例子程序也放在了MASM的工程目录下,有兴趣的可以看看。 4、把帮助文件更新为 RadASM 官方主页上的最新版本。 061207新增: 1、添加由 drizz 写的两个库文件: (1)、Stdlib.lib:包含一些对文件、注册表、INI文件、字串等一些常用的操作
函数
,可以直接
调用
,以减少编程工作量。 (2)、cryptohash.lib:密码学算法库,包含大部分常用密码学算法。 这两个库我都在RadASM中添加了相应的API文件,方便写代码时自动列出
函数
。 081218: ResEd 更新为 2.2.0.0d 汉化版,支持把 .rc 文件中的对话框部分导出为 RadASM 的 dlg 格式文件及添加 XP 界面等。 Language目录下的RadCHS.lng和RadENG.lng分别是简体中文和英文语言文件,可在RadASM的选项->语言菜单中选择。RadLNG.exe是用来查看语言文件的工具。 091209: 1、主程序汉化版本更新为 2.2.1.8f,同时更新语言文件。 2、ResEd 汉化版本更新为 2.2.0.5b。 3、除汉化了更新的插件外,重新汉化了 AdvEdit.dll(高级编辑) 插件。 091228: 1、主程序汉化版本更新为 2.2.1.9。 2、RadASM.ini 中的 [Accept] 段下添加了 DontAsk=1,这样执行编译好的程序时不会再有提示(类似与 2.2.1.5 及以前版本)。如仍需要执行程序时提示的话,请把添加的 DontAsk=1 这一行删除。 一点建议: 1、建议把RadASM安装在根目录下,如 D:\RadASM。 2、如果在编译 Win32 Asm 程序时有问题,一个简单的方法就是把 RadASM 目录下的 Masm32 剪切到 RadASM 安装的根目录,如 D:\Masm32,再在 RadASM 中重新设置路径。 3、RadASM 中添加的插件 CodeTemplates.dll 是用于在编辑代码时输入定义好的代码模板的,默认调出方式是Ctrl+J,可根据Addins\Help目录下的帮助文件CodeTemplates.Txt(我已翻译过)来自己配置需要的模板。 4、格式化代码的插件(TabAddin.dll)我根据其帮助文档和自己的测试结果进行了汉化。本来想把这个插件的帮助文档一起汉化的,可实在没太多时间,只能让大家根据汉化插件的界面来对照英文的帮助文档来理解此插件的功能,造成不便的地方还望大家原谅!简单说一下此插件汉化后菜单上各个按钮的功能:“左移”:把选中的代码左移一个制表符;“右移”:选中代码右移一个制表符;“规范化”:把选中的排列不整齐的代码按照选项中的设置进行排列;“标准化”:把你选中的代码按选项中的设置进行整理,使代码具有更好的可读性;“显示选项”:显示设置选项。 声明: 1、此汉化软件是免费软件,请在转载时保留其内容的完整性! 2、此软件仅用于个人学习使用,禁止用于商业用途,否则后果自负! HA.RadASM.v2.2.1.9.cao_cong.exe 的 MD5 值: 7BE397D8B107D68286EA07964DEF8A61
在汇编中
调用
C库
函数
在汇编语言中如果能够
调用
C语言的库
函数
,有时会很方便 先给个示例程序: .386 .model flat,stdcall option casemap:none ;Include定义 include stdio.inc includelib ms
vc
rt.lib .data szMsg db "在汇编程序中
调用
C的puts
函数
!",0 .
使用
TASM
编译COFF格式和连接
作 者: Anskya看到网络上流传的一份Drocon的mercury的代码程序源码使用
TASM
32编译使用MASM32来连接...关键的地方就在这里为什么要使用
TASM
编译。。。正常情况下
TASM
连接出来的程序代码体积远远大于MASM32连接出来的。。其实具体看一下就不难发现.
TASM
编译出来的obj体积很小,连接出来以后体积增加了,既然编译器原理差不多为什么不可以这样使用(我是以FA
汇编语言
21,496
社区成员
41,617
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章