c和汇编互相调用

a2824cl 2002-10-05 10:15:31
谁能具体讲讲,有网上的教材也可以
...全文
227 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
a2824cl 2002-10-15
  • 打赏
  • 举报
回复
非常感謝大家,尤其是xiaott(苹果),給了我很多的幫助。預祝我星期四報告順利吧。謝謝
xdspower 2002-10-13
  • 打赏
  • 举报
回复
好象有本书是专门讲这类问题的,已经出了很久了,其实调用主要是在连接的时候实现的,只不过在编写供其他语言调用的函数时要按照一定的接口规范来定义接口,这样产生的目标库才能被相应的连接程序所识别,才能更好的方便的被连接,如果你不按这样的规范来,也不是完全不能成功,而是你可能在目标语言的调用接口时要更多的定义,或者使用来不方便。
特别是c/c++同汇编的相互调用,基本上怎么都可以,目标代码就是连接库嘛,语言本身就多的时,可是如果在接口定义时没有按规范,这使用起来就不方便了,比如变量名成了奇怪的字符串了!
a2824cl 2002-10-13
  • 打赏
  • 举报
回复
程序用什么命令运行?
a2824cl 2002-10-13
  • 打赏
  • 举报
回复
xdspower() ,我就是找不到什么好书,才问题多多.我现在就想对具体的这个问题求解. 能指点我我该用什么命令编译吗?
a2824cl 2002-10-10
  • 打赏
  • 举报
回复
告诉我如何在汇编里调用C吧。最好吧文章的连接给我。我要做报告,需要准备很多材料。
a2824cl 2002-10-08
  • 打赏
  • 举报
回复
up
Crystal_arrow 2002-10-07
  • 打赏
  • 举报
回复
关注
jakie 2002-10-07
  • 打赏
  • 举报
回复
楼上的例子很不错的
a2824cl 2002-10-07
  • 打赏
  • 举报
回复
看在给分的面子上,在告诉我如何在汇编里调用C吧。最好吧文章的连接给我。我要做报告,需要准备很多材料。
a2824cl 2002-10-07
  • 打赏
  • 举报
回复
等待
a2824cl 2002-10-07
  • 打赏
  • 举报
回复
你是哪里找到这个的能把连接给我吗?
a2824cl 2002-10-06
  • 打赏
  • 举报
回复
请问xiaott(苹果) , 你是哪里找到这个的能把连接给我吗?

xiaott 2002-10-06
  • 打赏
  • 举报
回复
//例程:

例程1、============================================================
C语言调用一个汇编语言程序,传送两个参数A与B,汇编过程完成A乘以2的B次方,计算并将结果由C语言输出。程序如下:

/*C语言程序:CAC1.c*/
/*CAC1.C--MSC call MASM routine*/
extern int power2(int,int)
main()
{
printf("3 times 2 to the power of 5 is%d\n",power2(3,5));
}

;汇编语言程序:CAA1.ASM
;CAA1.ASM--MASM routine called by MSC
.MODEL SMALL
.CODE
PUBLIC_power2
_power2 proc
push bp ;save bp
mov bp,sp ;point to stack
mov ax,[bp+4] ;load arg1
mov cx,[bp+6] ;load arg2
sh1 ax,c1 ;calculate
pop bp ;restore bp
ret ;return
_power2 endp
end

这是一个极简单的程序,C语言程序先用extern以被调用汇编过程power2作了说明,变量类型为int型,C语言程序用小型模式编译,在汇编程序中用了.MODEL SMALL与之呼应,并将被调过程power2前加上下划线且说明成PUBLIC,在结束时,只用指令RET返回。

例程2================================================================
C语言调用汇编程序,无参数传递,C语言程序先输出一数字序列,然后把控制交给汇编程序,由汇编过程输出后继序列。程序如下:

/*C语言程序:CAC2.C*/
extern print();
main()
{
printf("follows are printed by c language:\n");
printf("0123456789\n");
printf("follows are printed by MASM:\n");
print();
}

汇编语言程序:CAA2.ASM
.MODEL SMALL
.DATA
string db"0123456789",0dh,0ah,'¥'
.CODE
PUBLIC_print
_print proc
mov dx,offset string
mov ah,09h
int 21h
ret
_print endp
end

这里,主调C程序调用了汇编过程print,在汇编过程中对print分别用PUBLIC和下划线作了说明,由于只传递参数,故无需设置基址指针BP,即未采用push BP和mov BP,sp指令。返回时也直接用了RET指令。

例程3=================================================================
C语言采用传址方式向被调用的汇编过程传递参数。

/*C语言程序:CAC3.C*/
extern int plus(int *);
main()
{
int n=5;
print("befor call:n=%d\n",n);
plus(&n);
printf("after call:n=%d\n",n);
}

;汇编语言程序:CAA3.ASM
.MODEL SMALL
.CODE
PUBLIC_plus
_plus proc
push bp
mov bp,sp
mov bx,[bp+4]
mov al,[bx]
inc al
mov [bx],al
pop bp
ret
_plus endp
end

以传址方式传送参数,对外部过程的参数应当说明成一个指针,且函数plus返回一个整形值,即:extern int plus(int*);在调用时,由一元算符&取得变量N的地址作为实参传送。在汇编程序中,利用利用基址指针BP,先取地址,再间接取内容,修改后送回原处,同时以RET返回。


a2824cl 2002-10-06
  • 打赏
  • 举报
回复
有大段的教材和解释吗?

我要做报告.需要参考和翻译.
IamHacker 2002-10-05
  • 打赏
  • 举报
回复
错了!在VC++里用 _ASM{ .......}
IamHacker 2002-10-05
  • 打赏
  • 举报
回复
在VC++里用不着 _ASM{ .......}
ckacka 2002-10-05
  • 打赏
  • 举报
回复
前面要加上
asm: ....
可以直接操作变量
Windows环境下32位汇编语言程序设计 第2版(罗文斌) 完整光盘内容,包含每章内容的完整代码 本光盘所包含目录的说明 根目录下的 *.pdf ;附录A、B、C的电子版文档 Chapter02\Test ;测试编译环境 Chapter03\HelloWorld ;Hello World Chapter04\FirstWindow ;用Win32汇编写第一个窗口 Chapter04\FirstWindow-1 ;用Win32汇编写第一个窗口 Chapter04\SendMessage ;窗口间的消息互发 Chapter04\SendMessage-1 ;窗口间的消息互发 Chapter05\Menu ;使用资源 - 使用菜单 Chapter05\Icon ;使用资源 - 使用图标 Chapter05\Dialog ;使用资源 - 使用对话框 Chapter05\Listbox ;使用资源 - 使用列表框 Chapter05\Control ;使用资源 - 使用子窗口控件 Chapter05\ShowVersionInfo ;使用资源 - 显示版本信息资源的程序 Chapter05\VersionInfo ;使用资源 - 使用版本信息资源 Chapter06\Timer ;定时器的使用 Chapter07\DcCopy ;在两个窗口的 DC 间互相拷贝屏幕 Chapter07\Clock ;模拟时钟程序 Chapter07\BmpClock ;用 Bitmap 图片做背景的模拟时钟程序 Chapter07\TestObject ;一些常见的绘图操作 Chapter08\CommDlg ;使用通用对话框 Chapter09\Toolbar ;使用工具栏 Chapter09\StatusBar ;使用状态栏 Chapter09\Richedit ;使用丰富编辑控件 Chapter09\Wordpad ;一个完整的文本编辑器例子 Chapter09\SubClass ;窗口的子类化例子 Chapter09\SuperClass ;窗口的超类化例子 Chapter10\MemInfo ;显示当前内存的使用情况 Chapter10\Fragment ;内存碎片化的演示程序 Chapter10\FindFile ;全盘查找文件的例子 Chapter10\FormatText ;文件读写例子 Chapter10\FormatText\FileMap ;使用内存映射文件进行文件读写的例子 Chapter10\MMFShare ;使用内存映射文件进行进程间数据共享 Chapter11\Dll\Dll ;最简单的动态链接库例子 - 编写 DLL Chapter11\Dll\MASM Sample ;最简单的动态链接库例子 - 使用 DLL Chapter11\Dll\VC++ Sample ;最简单的动态链接库例子 - 在VC++中使用汇编编写的DLL Chapter11\KeyHook ;Windows 钩子的例子 - 监听键盘动作 Chapter11\RecHook ;Windows 日志记录钩子的例子 - 监听键盘动作 Chapter12\Counter ;有问题的程序 - 一个计数程序 Chapter12\Thread ;用多线程的方
NiceBASIC中文编程语言,是采用类似BASIC语法,并兼有C++的一些高级特性(比如:指针(Pointer)操作运算、自动化类(Class)、重载函数(OverLoad)、重载操作符(OverLoad)等等)集于一身的全中文关键字的编程语言,简称NB。   其独特个性化的全中文式编程模式,更易于国人理解和方便学习编程,不用懂英文也可以编写自己的程序软件。变量和函数等标识符名称,也可以用中文表示,方便于源码的交流和省略注释说明。 基本功能:   NB内置有基本BASIC函数库,和图像库(用于编写游戏)。 功能扩展:   以静态库(LIB)链接形式调用标准C语言函数库里的函数。可以使用由标准C语言和汇编ASM编写的静态库(LIB)作为函数功能扩展。可以调用WIN32API的大部分函数,已经在内部定义(.bi文件相当于C语言的.h)声明,直接引用即可,就像C++的WINDOWS开发包(SDK)。 NB的编译器是采用开源编译器后续开发的,可以编译四种类型的可执行文件:   一、控制台程序。类似于DOS界面的命令行提示符,但只能运行在WIN32平台。   二、WINDOWS图形界面程序。调用系统的WIN32API来构建GUI窗体组件。   三、WIN32 DLL 动态链接库。导出函数可以为多种调用约定,比如:Stdcall(标准WINAPI)、 Cdecl(兼容C语言)、Pascal 。可供给其它语言调用。   四、静态链接库。供给标准的C语言调用链接。就是说NB的静态库是兼容C语言的LIB,互相通用。 为了方便编写代码,附带专业级的多功能高级编辑器:支持中文的语法高亮,工程管理,代码提示补全,智能缩进,自动完成,插件,模板等功能。并且针对汉字输入字数多的缺点,采用首拼输入命令提示关联到函数名,变量名,常量名。比如要输入“如果”只须键入“rg”(“如果”二字的首拼)就会在提示列表中出现“如果”,选择即可输出“如果”到编辑器,方便快捷。 虽然NB目前还没有可视化的集成开发环境(Visual IDE),但NB提供了构建完整标准WIN32应用程序的所有功能。作为小巧的编程工具和中初级水平程序员进阶学习工具。选择NB应该是NB的选择!
NiceBASIC V1.0中文编程正式版(绿色版) 阿杰上传于:2008年12月29日16:11:16 NiceBASIC中文编程语言,是采用类似BASIC语法,并兼有C++的一些高级特性(比如:指针(Pointer)操作运算、自动化类(Class)、重载函数(OverLoad)、重载操作符(OverLoad)等等)集于一身的全中文关键字的编程语言,简称NB。   其独特个性化的全中文式编程模式,更易于国人理解和方便学习编程,不用懂英文也可以编写自己的程序软件。变量和函数等标识符名称,也可以用中文表示,方便于源码的交流和省略注释说明。 基本功能:   NB内置有基本BASIC函数库,和图像库(用于编写游戏)。 功能扩展:   以静态库(LIB)链接形式调用标准C语言函数库里的函数。可以使用由标准C语言和汇编ASM编写的静态库(LIB)作为函数功能扩展。可以调用WIN32API的大部分函数,已经在内部定义(.bi文件相当于C语言的.h)声明,直接引用即可,就像C++的WINDOWS开发包(SDK)。 NB的编译器是采用开源编译器后续开发的,可以编译四种类型的可执行文件:   一、控制台程序。类似于DOS界面的命令行提示符,但只能运行在WIN32平台。   二、WINDOWS图形界面程序。调用系统的WIN32API来构建GUI窗体组件。   三、WIN32 DLL 动态链接库。导出函数可以为多种调用约定,比如:Stdcall(标准WINAPI)、 Cdecl(兼容C语言)、Pascal 。可供给其它语言调用。   四、静态链接库。供给标准的C语言调用链接。就是说NB的静态库是兼容C语言的LIB,互相通用。 为了方便编写代码,附带专业级的多功能高级编辑器:支持中文的语法高亮,工程管理,代码提示补全,智能缩进,自动完成,插件,模板等功能。并且针对汉字输入字数多的缺点,采用首拼输入命令提示关联到函数名,变量名,常量名。比如要输入“如果”只须键入“rg”(“如果”二字的首拼)就会在提示列表中出现“如果”,选择即可输出“如果”到编辑器,方便快捷。 虽然NB目前还没有可视化的集成开发环境(Visual IDE),但NB提供了构建完整标准WIN32应用程序的所有功能。作为小巧的编程工具和中初级水平程序员进阶学习工具。选择NB应该是NB的选择!

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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