Keil中C语言与汇编语言混合编程_百度文库_第1页
Keil中C语言与汇编语言混合编程_百度文库_第2页
Keil中C语言与汇编语言混合编程_百度文库_第3页
Keil中C语言与汇编语言混合编程_百度文库_第4页
Keil中C语言与汇编语言混合编程_百度文库_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、keil C语言与汇编语言混合编程1. C语言中嵌入汇编1、在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码:#pragma ASM; Assembler Code Here#pragma ENDASM2、在 Project 窗口中包含汇编代码的 C 文件上右键,选择“Options for .”,点击右边的“Generate Assembler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色(有效状态;3、根据选择的编译模式,把相应的库文件(如 Small 模式时,是 KeilC51LibC51S.Lib加入工程中, 该文件必须作为工程的最后文件;4、

2、编译,即可生成目标代码。来个实例吧:i nclude void main(voidP2=1;#pragma asm          MOV R7,#10DEL:MOV R6,#20          DJNZ R6,$          DJNZ R7,DEL#pragma endasmP2=0;2 . 无参数传递的函数调用C51调用汇编函数1.无参数传递的函数调用*example.c*extern void delay100(;main(de

3、lay100;*example.a51*?PR?DELAY100 SEGMENT CODE; /        在程序存储区中定义段PUBLIC DELAY100;      /声明函数RSEG ?PR?DELAY100;    /函数可被连接器放置在任何地方DELAY100/P>        MOV R7,#10DEL:              MOV R6,#20  

4、60;     DJNZ R6,$        DJNZ R7,DEL        RETEND在example.c文件中,先声明外部函数,然后直接在main中调用即可。在example.a51中,?PR?DELAY100 SEGMENT CODE;        作用是在程序存储区中定义段,DELAY100为段名,?PR?表示段位于程序存储区内PUBLIC DELAY100;          作用是

5、声明函数为公共函数RSEG ?PR?DELAY100;          表示函数可被连接器放置在任何地方,RSEG是段名的属性段名的开头为PR,是为了和C51内部命名转换兼容,命名转换规律如下:CODE ?PR?XDATA?XDDATA?DTBIT?BIPDATA?PD3. 有参数传递的函数调用          记住哦,c文件和A51文件不能使用同一个文件名,不过我还不知道为什么会这样,有高手知道得话请告知。           

6、  今天说说带参数传递的函数调用,在C51和汇编之间传递参数的方式有两种,一种是通过寄存器传递参数,C51中不同类型的实参会存入相应的寄存器,在汇编中只需对相应寄存器进行操作,即达到传递参数的目的。        不同类型的数据及其传递参数的寄存器如下表所示:在C和汇编混合编程的时候,存在C语言和汇编语言的变量以及函数的接口问题。在C程序中定义的变量,编译为.asm文件后,都被放进了.bss区,而且变量名的前面都带了一个下划线。在C程序中定义的函数,编译后在函数名前也带了一个下划线。例如:extern int num就会变成 .bss _num

7、, 1extern float nums5就会变成.bss _nums, 5extern void func ( 就会变成 _func,一 汇编和C的相互调用可以分以下几种情况:(1) 汇编程序中访问c程序中的变量和函数。在汇编程序中,用_XX就可以访问C中的变量XX了。访问数组时,可以用_XX+偏移量来访问,如_XX+3访问了数组中的XX3。在汇编程序调用C函数时,如果没有参数传递,直接用_funcname 就可以了。如果有参数传递, 则函数中最左边的一个参数由寄存器A给出,其他的参数按顺序由堆栈给出。返回值是返回到A寄存器或者由A寄存器给出的地址。同时注意,为了能够让汇编语言 能访问到C语

8、言中定义的变量和函数,他们必须声明为外部变量,即加extern 前缀。(2) c程序中访问汇编程序中的变量如果需要在c程序中访问汇编程序中的变量,则汇编程序中的变量名必须以下划线为首字符,并用global使之成为全局变量。如果需要在c程序中调用汇编程序中的过程,则过程名必须以下划线为首字符,并且,要根据c程序编译时使用的模式是stack-based model还是register argument model来正确地编写该过程,使之能正确地取得调用参数。(3) 在线汇编在C程序中直接插入 asm(“*”,内嵌汇编语句,需要注意的是这种用法要慎用,在线汇编提供了能直接读写硬件的能力,如读写中断控

9、制允许寄存器等,但编译器并不检查和分析在线汇编语言,插入在线汇编语言改变汇编环境或可能改变C变量的值可能导致严重的错误。二 汇编和C接口中寻址方式的改变:需 要注意的是,在C语言中,对于局部变量的建立和访问,是通过堆栈实现的,它的寻址是通过堆栈寄存器SP实现的。而在汇编语言中,为了使程序代码变得更为精 简,TI在直接寻址方式中,地址的低7位直接包含在指令中,这低7位所能寻址的具体位置可由DP寄存器或SP寄存器决定。具体实现可通过设置ST1寄存器 的CPL位实现,CPL=0,DP寻址,CPL=1,SP寻址。在DP寻址的时候,由DP提供高9位地址,与低7位组成16位地址;在SP寻址的时候, 16位

10、地址是由SP(16位与低7位直接相加得来。由于在C语言的环境下,局部变量的寻址必须通过SP寄存器实现,在混合编程的时候,为了使汇编语言不影响堆栈寄存器SP,通常的方式是在汇编环境中使用DP方式寻址,这样可以使二者互不干扰。编程中只要注意对CPL位正确设置即可1 .word 的意思就相当与C语言里的int,char等定义一个变两的宽度2. 编译错误原因有2:a.如果在汇编里面定义.global(全局符号),那么在C语言里面应该用extern声明,以引用该符号。 b.在汇编里面声明的时候,符号前应加下划线,如 FIQ_Addr: .word EXTint_FIQ 应为: FIQ_Addr: .wo

11、rd _EXTint_FIQ 在C语言里面应用extern声明。 另外,一中方法是,用.ref 代替.global 来声明符号,这样就不用在C源程序里面用extern声明了。 两种方法结果相同。 我讲的是用C和汇编混编程用法,至于C+变量如何翻译成汇编符号可以用仿真器,自己去看,原则类似.汇编与C语言混合编程的关键问题1 C程序变量与汇编程序变量的共用     为了使程序更易于接口和维护,可以在汇编程序中引用与C程序共享的变量:     .ref_to_dce_num,_to-dte_num,_to_dce_buff,_to_dte_buff  

12、;   在汇编程序中引用而在C程序可直接定义的变量:     unsigned char to_dte_buffBUFF_SIZE;    /DSP发向PC机的数据     int to_dte_num;                          /缓冲区中存放的有效字节数     int to_dte_store;       

13、                 /缓冲区的存放指针     int to_dte_read;                          /缓冲区的读取指针     这样经过链接就可以完成对应。     2 程序入口问题     在C程序中,程序的入口是main(函数。而在汇编程序中其入口由*.cmd

14、文件中的命令决定,如:-e main_start;程序入口地址为 main _start。这样,混合汇编出来的程序得不到正确结果。因为C到ASM的汇编有默认的入口c-int00,从这开始的一段程序为C程序的运行做准备工作。这些工作包括初始化变量、设置栈指针等,相当于系统壳不能跨越。这时可在*.cmd文件中去掉语句:-e main_start。如仍想执行某些汇编程序,可以C函数的形式执行,如:     main_start(;            /其中含有其他汇编程序     但前提是在汇编程

15、序中把_main_start作为首地址,程序以rete结尾(作为可调用的函数的程序段,并在汇编程序中引用_main_start,即.ref _main_start。     3 移位问题     在C语言中把变量设为char型时,它是8位的,但在DSP汇编中此变量仍被作为16位处理。所以会出现在C程序中的移位结果与汇编程序移位结果不同的问题。解决的办法是在C程序中,把移位结果再用0X00FF去“与”一下即可。     4 堆栈问题     在汇编程序中对堆栈的依赖很小,但在C程序中分配局部变量、变量初始化、传递函数变量、保存函数返回地址、保护临时结果功能

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论