在KEIL C51 中 C语言里加入汇编语言(2006-12-26 13:33:50)
分类:C51编程
1. 通过使用预处理指令#asm
和#endasm来使用汇编语言。用户编写的汇编语言可以紧跟在#asm之后,而在#endasm之前结束。如下所示:
# asm
# endasm
在#asm和#endasm之间的语句将作为汇编语言的语句输出到由编译器产生的汇编语言文件中。
2.通过使用预处理指令# pragma asm和函数_asm()来使用汇编语言。在程序的开头加上预处理指令#pragma
asm,在该预处理指令之前只能有注释和其它预处理指令。 _asm()函数可按以下方式使用。 _asm(汇编语言字符串)
在汇编语言字符串中,可以通过回车和换行符把各个语句分开。
在C语言中使用汇编语言,可以操作C语言中的全局变量或完成用C语言难于完成的功能,但要注意以下几点:
① #asm不允许嵌套使用。
② 当使用asm语句时,编译系统并不输出目标模块,而只输出汇编源文件。
③ _asm只能用小写字母,如果写成大写,就作为普通变量。
④ #asm#endasm和_asm只能用在函数内。
C与汇编混合编程的一点总结
在C和汇编混合编程的时候,存在C语言和汇编语言的变量以及函数的接口问题。在C程序中定义的变量,编译为.asm文件后,都被放进了.bss区,而且变量名的前面都带了一个下划线。在C程序中定义的函数,编译后在函数名前也带了一个下划线。例如:
extern int num就会变成 .bss _num, 1 extern float nums[5]就会变成.bss _nums,
5 extern void func ( )就会变成 _func, 一 汇编和C的相互调用可以分以下几种情况: (1)
汇编程序中访问c程序中的变量和函数。
在汇编程序中,用_XX就可以访问C中的变量XX了。访问数组时,可以用_XX+偏移量来访问,如_XX+3访问了数组中的XX[3]。
在汇编程序调用C函数时,如果没有参数传递,直接用_funcname 就可以了。如果有参数传递,
则函数中最左边的一个参数由寄存器A给出,其他的参数按顺序由堆栈给出。返回
值是返回到A寄存器或者由A寄存器给出的地址。同时注意,为了能够让汇编语言能访问到C语言中定义的