logo资料库

C语言与汇编语言相互调用实现混合编程.pdf

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
电脑编程技巧与维护 C 语言与汇编语言相互调用实现混合编程 阿娜古丽·阿布拉 (新疆阿克苏职业技术学院,阿克苏 ) 843000 摘 要: 讲解了 C 语言与汇编语言相互调用的基本技术,二者结合实现混合编程的方法和在相互调用过程中需注意 的一些问题,并给出了应用实例。两者相互调用有效结合,扬长避短,是一种行之有效的程序设计及开发方法。 关键词: C;汇编语言;调用 The Mutual Transfer Realizes the Mix Programming of C and Assembly Language ( Akesu Vocation Technology College, Akesu 843000 ) Abla·Anaguli Abstract: This article mainly introduced the transfer mutually basic strokes of C and the assembly language, the method of realizing the mix programming as well as some questions which the two union must pay attention mutually in the calling pro - cess, then it provides their process of examples. Both transfer the effective union mutually, it enhances strong points and avoids weaknesses, it is one effective programming method of exploitation. Key words: C; Assembly Language; Transfer 1 引言 C 。 。 、 。 、 、 DOS BIOS 语句精炼灵活 语言是一种介于高级与低级之间的中级语言,以其数据 类型丰富 效率高,表达力强以及可移植性 它有丰 好等诸多优点,成为目前倍受欢迎的一种编程语言 和 的中断功能调用,完成 富的库函数,也可以使用 许多由汇编语言完成的工作 但在对速度要求较高的场合, 以及在访问计算机系统的硬件资源或接口地址的读写等方面, 汇编语言作为一种符号语言,具有 却显示出了明显的不足 代码短,占用内存空间少,装载运行速度快,并能对硬件资 源进行直接控制等优点,对位 字节和地址进行操作的功能, 成为最受欢迎的编程语言之一 但其编程工作量大,开发周 。 事实上没有一种编译程序所产 期长,容易出错且不宜调试 生的目标代码能够像汇编程序那样高效和紧凑 大多数情况 下,这种小差别无关紧要,但在某些特殊情况下,对程序的 空间和时间要求很高的场合,如浮点数计算软件包就是用汇 编语言写的,因为它使用频繁,并且很大程度上影响着使用 所以有时需要使用汇编语言编写程序, 这些程序的执行速度 来满足应用程序中局部的特殊要求 语言和汇编语言 混合编程,两种语言的程序相互调用,进行参数传递,共享 数据结构及数据信息,这样能充分发挥各语言的优势和特点, 提高程序的运行速度和效率以及应用软件的效率 基于上述 情况,将两者有效结合,混合编程,扬长避短,是一种行之 有效的程序设计开发方法 。 2 混合编程的调用规则 使用 。 。 。 。 。 ( ) 参数传递的次序与它们出现的次序是相反的 1 ) ( ) 传递完参数后, IP 2 语言是 语言还将保存 ( C 存储模式下编译的 (或者过程是 如果 , 或 CS 。 。 C C SMALL COMPACT 本文收稿日期: 2009-1-1-8 46- - ( ) 最后一条指令应当是后面不带数字的 4 ,因为堆 程序重新获得控制权以后才会执 RET 栈到原始位置的工作将由 行 C 语言共享的名称都必须在前面加下划线, 。 而且 C ) 任何与 ( 5 语言只识别前 C ( ) 对于普通的参数 6 8 C 个字符 。 语言传递的是参数值,而对于数 组,传递的是指针 (也就是数据的地址) 。 ( ) 如果 7 C 语言是在 编 译 的 , 那 么 汇 编 语 言 过 程 应 该 设 为 MEDIUM、LARGE 模式下 语 言 是 存储模式下编译的,那么汇编语言过程 HUGE 型 ; FAR 或 C 或 SMALL 应该设为 COMPACT 型 NEAR 。 NEAR 型 的), 那 么 只 保 存 模式下编译的 (或者过程是 IP , 而 在 HUGE 都会被压入堆栈,其顺序是 是 语言自动进行的而不需要干预 C ( ) 还有 3 BP CS FAR 在前, IP 。 和偏移地址来访问参数 。 或 MEDIUM、 LARGE 型的),那么 和 在后 IP 不过这个过程 CS 。 也必须保存在堆栈中,然后才可以通过 BP 不过在 MASM5.1 TASM1.0 或 在共享名称前加下划线并保存 及更高的版本的情况下就不 这些琐 BP 、 必担心偏移地址 事,因为它们可以由编译器自动完成 。 3 汇编语言中调用 C 语言函数 。 这时就需要在汇编语言和 内嵌汇编不用单独编辑汇编语言文件,比较简洁,但是 有诸多限制,当汇编语言的代码较多时一般放在单独的汇编 语言之间进行一些数据 文件中 在汇编语言中调 的传递,最简便的办法就是使用全局变量 用 语言的函 数名,然后将 语言文件中进 行编译,剩下的工作由连接器来处理 语言的代码放在一个独立的 语言的函数,需要在汇编中 。 对应的 IMPORT C C C C C 。
SOFTWARE DEVELOPMENT AND DESIGN 软件开发与设计 编译系统在所有 mingw 所以在汇编代码中要用 C 语言符号前加了一个下划线前导 还是用 指令进行特殊处理 extern 假设分别建了两个文件,一个是 ,两个文件中各有一个函数 。 。 Calc. 。 符 实例来说明比较直观 ,另一个是 。 c CallCalc.asm 中内容为: Calc.c /* Calc.c */ /* a simple example: */ /* add () as a callee, called by CallCalc.asm */ extern int add (int x, int y) ; int add (int x, int y) { return (x + y) ; } CallCalc.asm 中的内容为: in Calc.c in Calc.c ;CallCalc.asm ;a simple example: ;EntryPoint () as a caller, call add () [section .text] extern _add EntryPoint: push 1 ; param y push 2 ; param x call _add ; call add () add sp,2 ; remove params x and y ... ret add () 返回值按照 C 码中要先要用 能在程序中使用 前导下划线就可以了 4 在 C 语言中调用汇编 4.1 汇编函数 _add 这里只需要知道 关键字将 。 。 C C 在 语言中调用汇编文件中的函数,要做的主要工作有 关键字; 导出函数名,并用该函数名作为汇 语言中声明函数原型,并加 两个,一是在 C 二是在汇编中用 EXPORT 编代码段的标识;最后用 语言中使用该函数了 从 语言还是汇编 实现是用 名起到表明函数代码起始地址的左右,这个和汇编的 一致的 C 语言的角度,并不知道该函数的 语言的函数 更深的原因是因为 是 然后,就可以在 mov pc, lr 返回 extern label 。 。 。 C C C 。 /* cfile.c * in C,call an asm function, asm_strcpy * Sep 9, 2004 */ #include extern void asm_strcpy (const char *src, char *dest) ; int main () { const char *s = " seasons in the sun" ; char d [32] ; 语言调用约定存放在 函数接受两个整型参数,相加后返回给调用者, 寄存器中;在汇编代 EAX 声明为外部符号,然后才 的符号规则是要加一个 extern 在调用的地方用的也是 call _add。 。 C ( ) 必须使用 2 ( ) 将 3 命名为 Tasm.exe。 ( ) 对内嵌汇编指令的 4 masm.exe 结束,一行中可以有多个汇编语句,相互间用 不能跨行书写 ; ” “ 结束,也可以用换行符 分隔,但 ; ” “ 语言的注释分隔符 宏汇编程序拷贝到 和 “/ *” TubroC “* / ”。 目录下,并重 [r0] , #1 ;address increment after read asm_strcpy (s, d) ; printf (" source: %s" , s) ; printf (" destination: %s" ,d) ; return 0; } asm function implementation; AREA asmfile, CODE, READONLY EXPORT asm_strcpy asm_strcpy loop ldrb r4, cmp r4, #0 beq over strb r4, b loop over mov pc, lr END 在这里, 的规定来进行的 [r1] , #1 C PCS 数,对应的用 的返回值通过 4.2 汇编代码 R0-R3 来返回 。 R0 C 中调用汇编代码规则: 在 ( ) 内嵌的汇编语句可以用 1 语言和汇编语言之间的参数传递是通过 简单地说就是如果函数有不多于 来进行传递,多于 AT- 个参 个时借助栈,函数 4 。 4 为: TCC.B.XXX 其中, 文件名 库文件名 为库文件所在目录的路径,文件名是内嵌汇 。 源程序进行编译 连接,格式 、 编指令的 C XXX 源程序的文件名 C 。 ) 在汇编语言中使用寄存器时,不区分大小写,且只 ( 5 程序中使用汇编语言的寄 提供的寄存器名,但在 能是 存器时,要用大写且前面加一个下划线 8086 C 。 SimpleRet.asm , 一 个 是 假 设 有 两 个 文 件 , 一 个 是 CallAsm.c。 SimpleRet.asm 中的内容是: ;;;;;;;;;;;;;;;;;;;;;;;;;;; do nothing,just return a integer value; ;;;;;;;;;;;;;;;;;;;;;;;;;;; [section .text] [bits 32] global _RetInt _RetInt: mov ax,1 ret CallAsm.c /* a simple caller which call asm */ 中的内容是: (下转到 50 页) 47- -
电脑编程技巧与维护 录协议传送的数据包括一个序列号,这样就可以检测消息的 记录 丢失 协议还可以执行压缩功能 如果协商好了压缩算法,那么 改动或重放 SSL 、 。 。 OpenSSL 的记录层协议是为信息的交流提供通信和认证功 能的,并且它的保护是建立在一个面向连接的可靠传输协议 (例如 记录层的封装过程, 则对于网络传输中数据的安全,采用专用的加密通信方式具 有重大意义 ) 之上的 理解了 OpenSSL TCP/IP 。 。 参考文献 . SSL VPN 的设计与实现 . 计算机技术与发 [1] 郭铃,李伟生 展, 2007, 17 (8) : 149-154. [2] Network Security with Openss1.Publisher 2002. : Reilly& Associates. [3] [4] . 利用 林雪云 用, 马淑文 工程与设计, . SSL VPN 2008, 15 (2) : 76-79. 为 SSL TcpSocket 通信加密 . 电脑开发与应 技术在校园网中的应用与研究 计算机 . 2007, 28 (21) : 5137-5143. [ 5] R. Rosen. Creating VPNs with IPsec and SSL/TLS. Linux Journal, 2008, (165) : 62-67. [ 6] R. Mraz. Secure Blue: an achitecture for a scalable, reliable high volume SSL Internet server. Computer Security Applica- tions Conference, 2001, 10 (14) : 391-398. 作者简介 张艺博,男 ( 安全,软件工程和程序设计方向 1973- 。 ),讲师,硕士,研究方向:计算机信息 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (上接第 27 页) 调,而颜色丰富的数字彩色屏价格贵的缺点,对颜色要求不 高的工业仪器仪表中具有较好的应用价值 。 参考文献 [1] [2] [3] 张蓬鹤,米德伟 在高速处理器 . DSP 图形点阵式液晶显示器 中的应用 国外电子元器件, MSP-G320240 2004, 2: . . 31~33. 黄丽薇,喻强,王静 的研究与设计 林振华 . 技术, VHDL 用 2001, 2:78~79. . 基于 CPLD 的双屏结构液晶控制器 微计算机信息, : 2006, 22 82~83. 和有限状态机设计 VRAM 控制器 电子 . 5 结语 通过编程下载到 的 实现对 很方便地应用于其他的显示屏 AT056TN04 8 芯片中,加上简单的外围电路, 种基本颜色的显示,适当调整就可以 克服了单色液晶模块色彩单 XC95216 。 作者简介 杨涛,男 ( 处理 杨扬,硕士研究生 1982- 。 。 ),硕士研究生,主要研究方向:通信信号 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 所以,在具体开发设计阶段,应该综合考量各语言的特 (上接第 47 页) 性 点,权衡利弊,才能设计出优秀的程序 。 。 [1] [2] [3] [4] . . . 1999. 语言程序设计 谭浩强 版社, 沈美明,温冬蝉编著 北京:清华大学出版社, 孙振业,史宝慧编著 社, 张雪兰 . 版社, 1999. . C 汇编语言程序设计 2001. 参考文献 第二版 ,北京:清华大学出 [M] 汇编语言程序设计 [M] . 电子科技大学出版 . IBM-PC 1994. 语言及应用 北京:北京理工大学出 [M] . 作者简介 阿娜古丽 阿布拉,女 ( 向:程序设计和平面设计 . 1964- 。 ),高级讲师 学士,主要研究方 / extern int RetInt (void) ; int main (void) { printf (" %d\n" ,RetInt ()) ; return (0) ; } 运行结果将会打印 所有的要点就是 关键字的使用, C global 1。 语言调用约定和 将符号导出给链接器 关键字以及 global ex- 声明外 extern C 语言与汇编语言混合编程,彼此相互调用,进行参数传 递,共享数据结构及数据信息,是一种有效的编程方法,但 在实际运用中要注意内存模式以及寄存器的分配给程序带来 的影响,并且还应考虑到这样做可能会丧失源程序的可移植 tern 部的符号 。 5 结语 50- -
分享到:
收藏