电脑编程技巧与维护
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-
-