C语言和汇编语言混合编程理工.doc_第1页
C语言和汇编语言混合编程理工.doc_第2页
C语言和汇编语言混合编程理工.doc_第3页
C语言和汇编语言混合编程理工.doc_第4页
C语言和汇编语言混合编程理工.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

C语言和汇编语言混合编程第6章 C语言和汇编语言混合编程6.1 C语言和汇编语言混合编程中参数传递和寄存器使用 在很多DSP应用中使用C语言和汇编语言进行混合编程。C语言具有可读性高、便于维护和可移植性好等优点,然而汇编语言具有实时运行效率高和代码效率高的优点。使用汇编语言可以更充分地利用DSP的硬件资源,例如乘累加单元、单指令重复、块重复和块移动等等。某些程序使用汇编语言编写实时运行效率是C语言的几十倍或更多,运算量越大,汇编语言编写的程序实时运行效率越明显。C函数调用汇编子程序和C函数一样有参数传递和返回,以下我们给出C函数如何调用C55x汇编子程序。6.1.1名称转换C函数调用汇编子程序时,汇编程序所有变量名和子函数名加前缀下划线“ _ ”,例如使用_sum作为汇编语言程序子函数名。如果汇编程序中定义了变量,必须加前缀下划线C函数才能使用该变量。前缀“ _ ”只在C编译时使用,当我们用C函数调用汇编子函数和变量时,不需要加前缀“ _ ”。以下是C程序调用汇编子函数例子。C程序:extern int sum(int *);/参考一个汇编函数int x4=0x1223,0x345,0x2345,0x3444;/定义全局变量并初始化int s;/定义全局变量void main()s=sum(x);/while(1);/汇编程序:.global _sum ;_sum ;rptz ac0,#3 ;add *ar0+,ac0;mov ac0,t0 ;ret ;2.变量定义当C和汇编子程序使用同一变量时,在汇编程序中必须使用.global,.def 或.ref定义成全局变量。3.编译模式使用C编译器,C55x的CPL(编译模式位)自动被置1,在进入汇编程序时,相对寻址模式使用堆栈指针SP。如果在汇编程序中我们需要使用相对直接寻址模式访问数据存储器,必须改成数据页DP直接寻址模式,可以通过清CPL位实现,在返回C调用程序前,CPL位必须重新置1。4.参数传递从C函数传递参数到汇编子程序,必须严格遵守C调用转换规则。传递一个参数,C编译器安排它一个特定的数据类型,并把它放到相应数据类型的寄存器里,C55x的C编译器使用以下三种典型的数据类型:n 数据指针:int *或long *n 16位数据:char、short或 intn 32位数据:long、float、double或函数入口如果参数指向数据内存,它们作为数据指针;如果参数能放到一个16位的寄存器里,它作为16位数据,例如数据类型为int和char,否则作为32位数据;参数也可以是结构体,一个结构体是两个字(32位)或少于两个字将作为32位参数,并使用32位寄存器传递,超过两个字的结构体,使用参考点传递参数,C编译器将使用指针来传递结构体的地址,这个指针作为一数据参数。在子程序调用中,函数中的参数顺序地安排到寄存器中,参数存放寄存器和其数据类型相对应,表6-1是参数类型和寄存器安排顺序表。表6-1参数类型和寄存器安排顺序表参数类型寄存器安排顺序16位数据指针AR0,AR1,AR2,AR3,AR423位数据指针XAR0,XAR1,XAR2,XAR3,XAR416位数据T0,T1,AR0,AR1,AR2,AR3,AR432位数据AC0,AC1,AC2从表6-1中看到辅助寄存器既可作为数据指针又可以作为16位数据寄存器,例如T0和T1保存了16位数据参数,并且AR0已经保存了一个数据指针参数,那么第三个16位参数数据将放到AR1。5.参数返回值从被调用的子程序返回值,当返回一个16位数据使用T0;当返回一个32位数据使用AC 0;当返回一个数据指针使用XAR0;当返回一个结构体,这个结构体在当前的堆栈里。以下是几个参数传递和返回值使用寄存器的例子:例1:返回值存放于T0,参数传递16位数据i使用T0,16位数据指针*k使用AR0,32位数据p使用AC0;int func( int i, int *k, long p )T0 T0 AR0 AC0例2:返回值存放于AC0,参数传递16位数据i使用T0,16位数据指针*k使用AR0,16位数据p使用T1,16位数据n使用AR1;long func( int i, int *k, int p, int n )AC0 T0 AR0 T1 AR1例3:返回值存放于AC0,参数传递16位数据i使用T0,16位数据指针*k使用AR0,32位数据p使用AC0,16位数据n使用T1。long func( int i, int *k, long p, int n )AC0 T0 AR0 AC0 T16.寄存器的使用和保存当使用一个函数调用,调用函数和被调用函数之间寄存器安排和保存被严格定义。被调用函数需使用这些寄存器:T2,T3,AR5,AR6,AR7,AC3时,在使用之前必须先将其内容保存之后再使用,可以使用压栈来保存这些寄存器,在返回前按照先入后出顺序弹栈,将其内容恢复;被调用函数可以自由使用这些寄存器:AC0AC2,T0,T1和AR0AR4,不需要预先保存和恢复。调用函数如果需要使用AC0AC2,T0,T1和AR0AR4这些寄存器的内容,在进入被调用函数之前,需要先将其内容压栈保存。6.2 C55x DSP C语言和汇编语言混合编程实验6.2.1实验目的n 学习C语言和汇编语言混合编程的编写方法;n 掌握C语言调用汇编程序;n 学习C语言和汇编语言之间参数的传递和返回。6.2.2 实验设备n PC兼容机一台;操作系统为Windows2000 (或WindowsNT、Windows98、WindowsXP);n 计算机安装CCS 5000或CCS 3.1。6.2.3实验内容使用C语言和汇编语言进行混合编程,使用C程序调用汇编子程序,使用汇编语言编写一个两个数组乘累加运算公式程序,C程序将两个数组首地址和长度传递给汇编程序,汇编程序将运算结果返回给C程序。乘累加公式: 6.2.4实验步骤1. 实验准备参照第1章的内容,将CCS设置成C55x 软件仿真,启动CCS;2. 建一个工程;3. 建一个C文件,把C语言程序输入到文件中,把该文件添加到工程;4. 建一个汇编asm文件,把汇编程序输入到文件中,把该文件添加到工程;5. 建一个命令cmd文件,把命令输入到文件中,把该文件添加到工程;6. 编译工程,装载输出文件;7. 打开CPU寄存器观察窗;8. 从菜单ViewWatch Window打开变量观察窗口,如图6-1所示; 在Watch 1窗口Name栏输入全局变量的名称,可以在Type栏看到该变量的所定义的类型,在对应变量Radix栏点击鼠标左键,将弹出数据显示类型选择条,可以选择相应的数据类型,将变量s3数据类型选择Q15格式。图6-1变量观察窗口9. 将程序运行到sum( )子程序;可以在Watch Locals观察窗口看到局部变量k,l,s的值,如图6-2所示。图6-2 局部变量观察窗口10. 继续运行程序,直到while( )处;可以在变量观察窗口Watch 1处观察变量s1,s2,s3的变化,如图6-2所示。图6-3 局部变量观察窗口在运行程序时,注意观察寄存器:AC0,T0,XAR0,XAR1,XAR2,XAR3等的变化,在参数传递和返回中使用了这些寄存器。6.2.5 程序清单参考1. C语言程序extern int mac1(int *,int *,int );extern long mac2(int *,int *,int );extern int mac3(int *,int *,int );/all data are Q15int x4=0x1223,0x345,0x2345,0x3444;int a4=0x4567,0x345,0x786,0x4332;int n=4; int s1; long s2; int s3;int sum();void main()int s4;s4=sum();s1=mac1(x,a,n);/*ar0=x0,*ar1=a0,t0=n,return is stored in t0 s2=mac2(x,a,n);/*ar0=x0,*ar1=a0,t0=n,return is stored in ac0s3=mac3(x,a,n);/*ar0=x0,*ar1=a0,t0=n,return is stored in t0while(1);int sum()int s;int k=3;int l=9; s=k+l; return(s);2. 汇编程序.global _mac1,_mac2,_mac3_mac1 ; int mac1(int *, int *, int ); first data second data window length; return value is 16bit and storing t0sub #1,t0mov t0,mmap(csr)mov #0,ac0rpt csrmac *ar0+,*ar1+,ac0mov ac0,t0ret_mac2 ; long mac2(int *, int *, int );first data second data window length ; return value is 32bit and storing ac0sub #1,t0mov t0,mmap(csr)mov #0,ac0rpt csrmac *ar0+,*ar1+,ac0ret_mac3 ; int mac3(int *, int *, int ); first data second data window length ;all data is Q15 ; return value is 16bit and storing ac0bset frctsub #1,t0mov t0,mmap(csr)mov #0,ac0rpt csrmac *ar0+,*ar1+,ac0mov hi(ac0),t0bclr frctret3. 命令文件-stack 0x500 /* Primary stack size */-sysstack 0x500 /* Secondary stack size */-c /* Use C linking conventions: auto-init vars at runtime */-u _Reset /* Force load of reset interrupt handler */* SPECIFY THE SYSTEM MEMORY MAP */MEMORY PAGE 0: /* - Unified Program/Data Address Space - */ RAM (RWIX) : origin = 0x000100, length = 0x01ff00 /* 128Kb page of RAM */ ROM (RIX) : origin = 0x020100, length = 0x01ff00 /* 128Kb page of ROM */ VECS (RIX) : origin = 0xffff00, length = 0x000100 /* 256-byte int vector */ PAGE 2: /* - 64K-word I/O Address Space - */ IOPORT (RWI) : origin = 0x000000, length = 0x020000/* SPECIFY THE SECTIONS ALLOCATION INTO MEMORY */SECTIONS .text ROM PAGE 0 /* Code */ /* These sections must be on same physical memory page */ /* when small memory model is used */ .data RAM PAGE 0 /* Initialized vars */ .bss RAM PAGE 0 /* Global & static vars */ .const RAM PAGE 0 /* Constant data */ .sysmem RAM PAGE 0 /* .stack RAM PAGE 0 /* Primary system stack */ .sysstack RAM PAGE 0 /* Secondary system stack */ .cio RAM PAGE 0 /* C I/O buffers */ /* These sections may be on any physical memory page */ /* when sm

温馨提示

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

评论

0/150

提交评论